0

私はこれに少し苦労しています。Googleで調査した後、呼び出されたときにうまく機能する次のタイマールーチンを作成しました

// play move method
public static void playMove() {
    int delay = 1200; // delay for 1 sec.
    int period = 1200; // repeat every sec.

    final Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        private int count = history.getGameIndex();

        public void run() {
            count++;
            if (count >= history.getTotalMoves() + 1) {
                timer.cancel();
                timer.purge();
                return;
            }
            history.next();
        }
    }, delay, period);
}

ただし、問題は、このコードを正しい場所である JToggleButton に統合する方法がわからないことです。これにより、再生をクリックすると動きが再生され、停止をクリックするとルーチンが停止 (または一時停止) されます。ここに私の JToggleButton コードがあります:

ImageIcon playIcon = new ImageIcon(
        JBoard.class.getResource("/images/menu/play.png"));

btnPlayMove = new JToggleButton(playIcon);
btnPlayMove.setToolTipText("Play");
btnPlayMove.setContentAreaFilled(true);
btnPlayMove.setMargin(new Insets(2, 2, 2, 2));

btnPlayMove.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent ie) {
        if (isConnected()) {
            showMessage("Engine disabled during network play...");
            return;
        } else if (btnPlayMove.isSelected()) {
            // play
            playMove();
            ImageIcon playIcon = new ImageIcon(JBoard.class
                    .getResource("/images/menu/play.png"));
            btnPlayMove.setIcon(playIcon);
        } else {
            // stop
            ImageIcon stop = new ImageIcon(JBoard.class
                    .getResource("/images/menu/stop.png"));
            btnPlayMove.setIcon(stop);

        }
    }
});
buttonPanel.add(btnPlayMove);

私はJavaにかなり慣れていないので、誰かが助けてくれるとうれしいです

4

2 に答える 2

1

あなたはjavax.swing.Timerを利用することができます

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

    @Override
    public void actionPerformed(ActionEvent e) {
        count++;
        if (count >= history.getTotalMoves() + 1) {
            timer.cancel();
            timer.purge();
            return;
        }
        history.next();
    }
});

timer.setRepeats(true);
timer.setCoalesce(true);
timer.setInitialDelay(1200);

次に、ボタンコードで、単に呼び出すtimer.start()か、timer.stop()

于 2012-07-17T23:09:44.467 に答える
0

playMovie メソッドを非静的にし、History をグローバル変数として宣言し、swing クラスに含めることをお勧めします。

History history = new History(); // assuming this with no-args

public void playMove() {
         int delay = 1200; // delay for 1 sec.
         // etc.
         // etc.
}

また、TimerTask スレッドがまだ実行されている場合は、プログラムで playMove() を停止する必要があります。

于 2012-07-17T22:05:01.920 に答える