0

私はより多くの GUI を使用しようとしていますが、何か問題があります。JLabels の配列があります。それぞれに 0 から 7 までの 1 つの数字が含まれています。背景色を黒から緑に変更して、数字を「点灯」させています。すべての奇数を暗く保ちながらすべての偶数を「点灯」させ、その逆にする方法はありますか? タイマーを使用してみましたが、アルゴリズムが正常に機能していません。以下は、タイマーを構成するメソッドのコードです。ありがとう

    public void configureAlternatingTimer() {
    if (this.timer != null) {
        this.timer.stop();
    }

    this.timer = new Timer(100, new ActionListener() {
        public void actionPerformed(ActionEvent evt) {

            for (int i = 0; i <= 8; i++) {
                if (i == 0 || i == 2 || i == 4 || i == 6) {
                    lights[1].setBackground(Color.black);
                    lights[3].setBackground(Color.black);
                    lights[5].setBackground(Color.black);
                    lights[7].setBackground(Color.black);
                    lights[i].setBackground(Color.green);
                }
                if (i == 1 || i == 3 || i == 5 || i == 7) {
                    lights[0].setBackground(Color.black);
                    lights[2].setBackground(Color.black);
                    lights[4].setBackground(Color.black);
                    lights[6].setBackground(Color.black);
                    lights[i].setBackground(Color.green);
                }
                if(i==8) {
                    return;
                }
            }

        }

    });
    this.timer.start();

}

また、7まで点灯してから0まで戻ってから繰り返す「ラーソンスキャナー」をシミュレートしようとしています。私はそれを 0 から 7 まで動かすことができます。ありがとう

4

2 に答える 2

0

をドロップするfor-loopと、イベント ディスパッチ スレッドがrepaintリクエストを処理できなくなります

代わりに、メソッドが呼び出されるたびに、actionPerformedある種のカウンターを更新し、それに対してアクションを実行します。たとえば...

this.timer = new Timer(100, new ActionListener() {
    private int sequence = 0;
    public void actionPerformed(ActionEvent evt) {
        if (sequence % 2 == 0) {
            lights[1].setBackground(Color.black);
            lights[3].setBackground(Color.black);
            lights[5].setBackground(Color.black);
            lights[7].setBackground(Color.black);
            lights[sequence].setBackground(Color.green);
        } else {
            lights[0].setBackground(Color.black);
            lights[2].setBackground(Color.black);
            lights[4].setBackground(Color.black);
            lights[6].setBackground(Color.black);
            lights[sequence].setBackground(Color.green);
        }
        
        sequence++;
        if (sequence > 7) {
            // This seems to be important...?
        }
    }
});

コメントに基づいて更新

これは、すべてのオッズまたはすべての偶数を表示する必要があります...

Timer timer = new Timer(500, new ActionListener() {
    private int sequence = 0;
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(sequence + "; " + (sequence % 2));

        for (int index = 0; index < lights.length; index++) {

            if (index % 2 == 0 && sequence % 2 == 0 || index % 2 != 0 && sequence % 2 != 0) {
                lights[index].setBackground(Color.GREEN);
            } else {
                lights[index].setBackground(Color.BLACK);
            }

        }

        sequence++;
        if (sequence > 7) {
            sequence = 0;
        }
    }
});
于 2013-10-31T03:11:39.947 に答える
0

偶数か奇数かを判断するには、モジュラス演算子 % を使用して、数値が奇数か偶数かを判断することを検討する必要があります。モジュラスは、除算後の余りを返します。

For example:
    4 / 2 = 2r0
    5 / 2 = 2r1
    6 / 2 = 3r0
    7 / 2 = 3r1
    so on and so forth...

if(i % 2 == 0) {
    // even
} else {
    // odd
}
于 2013-10-31T03:15:36.120 に答える