2012-12-16 50 views
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。對不起,如果我做錯了,我是這個論壇的新手。

回答

1

相反

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

盡也的repaint()

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

也許repaint(50L)代替。


如果您的問題的意思是:如何動畫在電池電量的變化。

使用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。

+0

對不起,但我實際上需要矩形下降,而不是向上上升。 –

+0

對不起,誤解了。一個評論:else部分中的代碼應該始終執行,也是第一次;把它帶到if語句之外。 –

1

由於您希望可見電池電量下降,因此您需要增加Y座標值(相對於batteryLevel的值)。你可以使用:

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

作品:D謝謝! –