0

コンポーネントを定期的に再描画するループを作成しました。

public class A extends Thread {

  private Component component;
  private float scaleFactors[];
  private RescaleOp op;

  public A (Component component){
  this.component = component;
  }

  public void run(){

    float i = 0.05f;
    while (true) {

        scaleFactors = new float[]{1f, 1f, 1f, i};
        op = new RescaleOp(scaleFactors, offsets, null);

        try {
            Thread.sleep(timeout);
        } catch (InterruptedException ex) {
            //Logger.getLogger(...)
        }
        component.repaint();
        i += step;
      }

    }

}

しかし、この場合、次のメッセージが表示されます (NetBeans 7.3.1):

ループで呼び出される Thread.sleep

この状況でもっと良い解決策があるでしょうか?

4

1 に答える 1

6

Swing はシングルスレッドです。を呼び出すThread.sleepと、EDTUI の更新が妨げられます。

代わりにSwing Timerを使用することをお勧めします。Swing コンポーネントと対話するように設計されています。

Timer timer = new Timer(timeout, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        component.repaint();
    }
});
timer.start();

編集:

タイマーを独自の内部から停止するにActionListenerは、通常、

@Override
public void actionPerformed(ActionEvent e) {
    Timer timer = (Timer) e.getSource();
    timer.stop();
}
于 2013-08-13T12:24:42.353 に答える