1

私のプロジェクトで paintComponent クラスを使用していますが、現在、長方形のサイズを上から下に縮小する方法を考えています。

これはコードの一部です:

public Battery(){

    super();
    firstTime = true;
    f = new Font("Helvetica", Font.BOLD, 14);
    m = Toolkit.getDefaultToolkit().getFontMetrics(f);
}

public void paintComponent(Graphics g){

    if(firstTime){

        firstTime = false;
        batteryLevel = 1 +  this.getHeight();
        decr = batteryLevel / 20; 

    }else{

        g.setColor(Color.RED);
        g.fillRect(1, 0, this.getWidth(), this.getHeight());

        g.setColor(Color.GREEN);
        g.fillRect(1, 0, this.getWidth(), batteryLevel);

        g.setColor(Color.BLACK);
        g.setFont(f);
        g.drawString("TEST", (getWidth() - m.stringWidth("TEST")) / 2 , this.getHeight() / 2);
    }

}

public void decreaseBatteryLevel(){

    batteryLevel -= decr; 
    this.repaint();

}    

PS。このフォーラムは初めてなので、何か間違っていたらすみません。

4

2 に答える 2

1

その代わり

    g.fillRect(1, 0, this.getWidth(), batteryLevel);

行う

    g.fillRect(1, batteryLevel, this.getWidth(), getHeight() - batteryLevel);

の代わりrepaint(50L)repaint().


あなたの質問が意味する場合:バッテリーレベルの変化をアニメーション化する方法。

javax.swing.Timer を使用します。

    int toPaintBatteryLevel = batteryLevel;
    // In the paintComponent paint upto toPaintBatteryLevel.

    Timer timer = new Timer(100, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (toPaintBatteryLevl == batteryLevel) {
                return;
            }
            if (toPaintBatteryLevl > batteryLevel) {
                --toPaintBatteryLevel; // Animate slowly
            } else {
                toPaintBatteryLevel = batteryLevel; // Change immediately
            }
            repaint(50L);
        };

    });

    timer.start();

コーディングを容易にするために、パーマネント タイマーがあります。外部で batteryLevel を変更すると、その時間が、paintComponent がペイントに使用する toPaintBatteryLevel を決定します。

于 2012-12-16T13:07:11.660 に答える
1

目に見えるバッテリー レベルを下げたい場合は、Y 座標を の値に対して増加させますbatteryLevel。あなたが使用することができます:

g.fillRect(1, getHeight() - batteryLevel, getWidth(), batteryLevel);
于 2012-12-16T13:36:06.267 に答える