特定のJava SwingのアルゴリズムでのActionListenerの遅れ?

デイブ:

私は前にここにこの質問をしてきましたが、それはあまりにも非特異的だったし、「最小限の再現性の例」を備えていなかったので、それが降ろされてしまいました。:)

基本的に私は、ユーザーがクリックし、「スタート」とすぐに、次のように私のアルゴリズムは行きたいです:

  • ボタンの4×4グリッド上で、ランダム化ボタンは、間に500ミリ秒の遅延で、次に黒、赤に変わり。
  • これは、6回繰り返されます

ここで私は悪意を遅延するための「タイマー」を実装しようとしましたが、失敗しましたコードは次のとおりです。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestMemoryGame extends JFrame {
private JButton[] button = new JButton[16];
private JButton start;
private JPanel grid;
private int counter = 6;
private Timer timer;
private int delay = 500;

private Color babyBlue = new Color(137, 156, 240);
private Color lightRed = new Color(255,69,0);

public TestMemoryGame() {
    super();
    init();
}

public void init() {
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setLayout(new GridBagLayout());
    setSize(500, 500);
    setBackground(Color.WHITE);

    grid = new JPanel(new GridLayout(4, 4));

    for (int x = 0; x < 16; x++) {
        button[x] = new JButton();
        button[x].setBackground(babyBlue);
        grid.add(button[x]);
    }
    grid.setPreferredSize(new Dimension(400, 400));
    add(grid);


    start = new JButton("START");
    start.setBackground(Color.ORANGE);
    start.setPreferredSize(new Dimension(150, 30));
    GridBagConstraints c = new GridBagConstraints();
    c.gridy = 1;
    c.insets.top = 10;
    add(start, c);

    start.addActionListener(startTimer);

    timer = new Timer(delay, action);

    pack();
    setVisible(true);
}

ActionListener startTimer = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        timer.start();
    }
};

ActionListener action = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        int[] array = new int[counter];
        for (int x = 0; x < counter; x++) {
            array[x] = (int)(Math.random() * 16);
            button[array[x]].setBackground(lightRed);
            timer.start();
            //Delay of 500
            timer.stop();
            button[array[x]].setBackground(Color.black);
        }
    }
};

public static void main(String[] args) {
    new TestMemoryGame();
}

}

私は非常に多くの異なるアプローチでこれを試してみたが、私はちょうど正しく「タイマー」を使用する方法を得るように見えることはありません。誰かがしようとすると、単にこれまでの任意の場所に私をリードしていない私にそれを説明するために、以下のコードでそれを実装するために時間がかかった場合、私は本当に、感謝します。:(

どうもありがとう!

camickr:

:私はあなたの最後の質問であなたの要件の一つ読み違えたActionListener内のJava Swingで特定の遅延を?私はより多くのスペースを持っているところなので、私は再びここに私の提案を修正再表示されます:

あなたのクラスでは:

  1. あなたはActionListenerにでのArrayListにアクセスできるようにインスタンス変数としてのArrayListを作成します。

あなたがボタンに追加したActionListenerでは、する必要があります。

  1. あなたはArrayListに色を切り替えたい6つのランダムボタンを追加します。あなたがランダムに6つのボタンを選択するためのループを作成しますので。
  2. ArrayListの中で最初のボタンの色を設定します
  3. タイマーを開始

タイマーのActionListenerの中で、あなたはその後になります。

  1. ArrayListの中で最初のボタンの色をリセット
  2. ArrayListのからの最初のボタンを削除します
  3. ArrayListのが空の場合は、タイマーを停止します
  4. それ以外の最初のボタンを取得し、色を赤に変更

だから、あなたは、[スタート]ボタンをクリックすると、最初のボタンが赤に着色されています。それはデフォルトにリセットされ、別のボタンが変更された後に、その時点でタイマー火災の500ミリ秒まで赤のままです。タイマーは500ミリ秒に再び発火するとプロセスが繰り返し続けます。

タイマーのActionListenerのにはループコードがないか注意してください。あなたはタイマーを停止するまで、タイマは、イベントごとに500ミリ秒を生成し続けます。

あなたはより多くの助けを必要とする場合は、新しいスレッドを作成していない、質問のフォローアップをお願いします。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=378791&siteId=1