3

パネルの左側から右側に正方形を移動させるコードを作成したい...コードのブロックに画像を表示してから、次のブロックに画像を表示するだけでよいことに気付きました。コードでは、画像を背景と同じ色のまったく同じ正方形でオーバーラップさせます...これを行うには、画像が表示され、1秒後にラップされてオーバーラップするようにするコードのようなタイマーが必要です。次に、新しい画像がそのすぐ横に表示されます

sleep.threadがGUIではうまく機能しないことに気付いた私はJavax.Swing.Timerに頼っています

今のところ、横に1つのボックスを表示させたいだけです

しかし、私はそれを使った経験がなく、私のコードで動作させるためにいくつかの助けが必要です-Andrew

    {

          g.setColor(Color.GREEN);
          g.fillRect(50, 100, 100, 100); //first box on a red background

                      //Timer goes here

                      g.setColor(Color.RED);
          g.fillRect(50, 100, 100, 100);//overlapps the first box
                      g.setColor(Color.GREEN);
          g.fillRect(50, 110, 100, 100);//sets a new box right beside it

    }

}
4

4 に答える 4

2

の作成javax.swing.Timerは実際には非常に簡単です。スケジューリングはバックグラウンドスレッドで自動的に行われるため、スレッドについて自分で心配する必要はありませんが、実装するリスナーのコードはGUIスレッドで実行されます。したがって、リスナー本体で必要なスイングコンポーネントを操作できます。

int interval = 1000; // repeating every 1000 ms
new Timer(interval, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // do whatever painting that you want
    }
}).start();
于 2012-12-13T18:06:46.647 に答える
1

ExecutorServiceを使用することをお勧めします

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

たとえば、あなたはそれに似た何かをすることができます

private static ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);
scheduledThreadPool.scheduleAtFixedRate(new DrawingTask(), 1000, 1000 TimeUnit.MILLISECONDS);

描画タスクは次のようになります。

public class DrawingTask extends TimerTask {

@Override
public void run() {
// previous co ordinates. This should be static
// sleep for a second
// re draw the old one
// draw the new one
}
}
于 2012-12-13T17:57:20.793 に答える
1

これが最善の方法かどうかはわかりませんが、場所を指定するために正方形を簡単に再定義できます。次に、タイマーに正方形のインスタンスの位置を更新させてから、repaint() を呼び出すことができます。これは、paint メソッドが毎回新しい正方形を作成するのではなく、新しい場所に背景と同じ正方形を描画するだけであることを意味します。

ペイント メソッドは次のようになります。

g.drawRect(referenceToSquare.getLocation().getX(), referenceToSquare.getLocation().getY(), 100, 100)

タイマーを次のように初期化します。

   Timer timer = new Timer(delayInMillis);
   timer.add(new ActionListener());

それから同じクラスに...

     actionPerformed(ActionEvent e) {
       if(e.getSource() == timer) {
           referenceToSquare.getLocation().getX()++;
       }
       frame.repaint();
     }

http://docs.oracle.com/javase/6/docs/api/java/awt/event/ActionListener.html

于 2012-12-13T17:43:16.727 に答える
1

次のように初期化します。

Timer <timernamegoeshere> = new Timer(<delayinmilis>,<actionlistener>);

したがって、タイマーコンストラクターに入力したミリ秒ごとにアクションが実行されます。

つまり、更新コードを に単純に配置しactionPerformed、正方形を移動するピクセルの量だけインクリメントされる変数と、 からtrueに切り替えるブール値falseを持つtrueことができ、それを描画し、falseそれを背景の色。

于 2012-12-13T17:33:45.867 に答える