あなたが何をしているのか見分けるのは難しいです、
paint()
しかし、メソッドRunnable
内からをオーバーライドしようとしているようです。run()
これは確かにできません。
論理は
- コンポーネントを取る
- ペイントメソッドをオーバーライドして、必要なものを描画します
- メソッドを呼び出して長方形の座標を更新します(またはこの場合、タイマーがそれを行います)
- コンポーネントを呼び出す
repaint()
よりも、ペイントメソッドを再度呼び出して、新しい座標で長方形を再描画できます(タイマーは、長方形の座標を変更した後の再ペイントも処理します)
- 最後の2つのステップを必要な回数/必要な回数繰り返します
(私が実際に意味するコンポーネントと言うとき、これがベストプラクティスであるためJPanel
、ペイント方法はオーバーライドされることを指します。)paintComponent(..)
JPanel
いくつかの提案:
1)オーバーライドするのpaint
ではなく、を使用JPanel
してオーバーライドしますpaintComponent
。
2)意図的に除外しない限り、ペイントチェーンを尊重し、オーバーライドされた(またはその事実のためのオーバーライドされたメソッド)super.XXX
の実装を呼び出すことを忘れないでください。paintComponent(Graphics g)
すなわち
class MyPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//do drawings here
}
}
3)描画する場合は、通常、の内容/描画に適合するspaintComponent
をオーバーライドgetPreferredSize()
して返す必要があります。つまり、次のようになります。Dimension
JPanel
class MyPanel extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(300,300);
}
}
3)GUIスレッドをブロックする代わりに見て、フリーズSwing Timer
しているように見せます。すなわちThread.sleep(..)
sleep
Timer t = new Timer(10, new AbstractAction() {
int count = 20;
@Override
public void actionPerformed(ActionEvent ae) {
if (count < 1000) {
//increment rectangles y position
//now repaint container so we can see changes in co-ordinates (unless you have a timer which repaints for you too)
count++;
} else {//counter is at 1000 stop the timer
((Timer) ae.getSource()).stop();
}
}
});
t.start();
Rectangle
4) Swingタイマーの代替(今のところSwingコンポーネントではないaのみを移動していることがわかります)はです。これは、Swingコンポーネントがそのメソッド内から作成/操作されないTimerTask
限り使用できます( SwingTimerのようなEDTでは実行されません)。に注意してください。スレッドセーフであるため、内で使用できます。run()
TimerTask
revalidate()
repaint()
TimerTask
上記の利点は、EDTの不要なコードが保持されることです(つまり、座標を変更してAWT長方形を移動する)。
final TimerTask tt = new TimerTask() {
@Override
public void run() {
if (count < 1000) {
//increment rectangles y position
//now repaint container so we can see changes in co-ordinates (unless you have a timer which repaints for you too)
count++;
} else {//counter is at 1000 stop the timer
cancel();
}
}
};
new Timer().scheduleAtFixedRate(tt, 0, 10);//start in 0milis and call run every 10 milis