1

私はJavaが初めてで、助けが必要です。基本的に 4 つの JButton (2 x 2 グリッド) のグリッドを持つ小さな Java デスクトップ アプリケーションを作成しています。個々の JButton の背景色を変更する必要があり、1 秒後に元の色に戻ります (私が作ろうとしているゲームは、点灯するボタンのパターンに従わなければならないサイモンのようなものです)。1 から 4 の範囲でランダムに生成された数値を含むベクトルがあり、ベクトルから各要素を取得し、対応するボタンを 1 秒間別の色に変更できるようにしたいと考えています (たとえば、ベクトルに 2 4 1 が含まれている場合、ボタン 2 を変更し、次にボタン 4 を変更し、次にボタン 1 を変更します)。

これは可能ですか、それとも JButtons 以外でこれを行うためのより良い方法はありますか? これを実装するにはどうすればよいですか?

また、私は Mac OS X を実行していますが、明らかに (フォーラムで読んだいくつかのことに基づいて) JButtons の背景の変更が好きではありません (システムのルック アンド フィールが原因だと思います)。どうすればこれを変更できますか?マックで動作しますか?

事前に助けてくれてありがとう:)

4

4 に答える 4

3

setBackground(...) メソッドを使用して Color を設定し、Swing Timer を使用して起動時に背景をリセットすることができます。

編集:

setBackground() メソッドが一部の LAF で機能しないという問題がある場合は、単色のアイコンをボタンに追加できます。次に、背景色を変更するには、アイコンを変更するだけです。

于 2010-03-17T20:49:28.433 に答える
3

1 つのアプローチは、色を表示するために拡張JToggleButtonおよびオーバーライドすることです。paintComponent()Ajavax.swing.Timerはタイミングを制御できます。これは、もう少し複雑なです。

private static class SimonButton extends JToggleButton {

    private final Color color;
    Dimension size = new Dimension(100, 100);

    public SimonButton(Color color) {
        this.color = color;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (this.isSelected()) {
            g.setColor(color);
        } else {
            g.setColor(Color.lightGray);
        }
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
    }

    @Override
    public Dimension getPreferredSize() {
        return size;
    }
}
于 2010-03-17T20:27:24.470 に答える
2

あなたの目的のために、必ずしも を使用する必要はありませんJButtonJLabelsまたはを使用できますJPanels

初期化中に、setBackground()それぞれに色を設定し、MouseListenerそれぞれに を追加してクリックを検出できます。

Simon パターンをフラッシュするには、javax.swing.Timer毎秒 1 回起動する を作成します。(1 秒が長いと思われる場合は、遅延を設定可能にすることをお勧めします。) 簡単にするために、タイマーsetOpaque(false)をすべてのJLabelsに設定setOpaque(true)してJLabelから、点滅させたい色の に設定します。を実行する前に、次のタイマーの反復まで待機したい場合があることに注意してください。そのため、同じフラッシュを連続して複数回setOpaque(true)フラッシュしたい場合は、フラッシュが一緒に実行されません。JLabel

を使用する利点は、 をsetOpaque()押したときと離したときMouseListenerに呼び出すだけで、正しいがクリックされたかどうかを確認できることです。特定の にどの色を使用するかを繰り返し再計算する必要はありません。setOpaque(true)setOpaque(false)JLabelJLabel

于 2010-03-17T21:23:44.410 に答える
0
okJButton = new JButton() {
@Override
public void paintComponent(Graphics g) {
    g.setColor(Color.decode("0X123456"));
    g.fillRect(0, 0, getSize().width, getSize().height);
}
};
okJButton.setForeground(Color.white);
okJButton.setBorder(new LineBorder(Color.white, 1));
于 2014-02-12T20:54:26.000 に答える