2

以下の添付コードを参照し、最後に私の質問を参照してください。

class events extends JFrame{
    private JLabel label;
    private JButton button;

    public events() {
        setLayout(new FlowLayout());

        button = new JButton("Click for text");
        add(button);

        label = new JLabel("");
        add(label);

        event e = new event();
        button.addActionListener(e);

    }

    public class event implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            int x = 0;
            if (x == 0) {

                label.setText("the new label");
                System.out
                        .println("setting x to 0 and label to display a label");
                x = 1;
                System.out.println(x);
            } else {
                label.setText("newerer label");
                System.out.println("i reached the else segment");

                x = 0;
                System.out.println(x);
            }

        }

    }

    public static void main(String args[]) {
        events gui = new events();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setTitle("Events Test");
        gui.setSize(300, 100);
        gui.setVisible(true);

    }

}

背景: 私は Java を学んでおり、概念を理解しようとしています。このプログラムでは、ボタンをクリックすると JLabel に「新しいラベル」の文字列値が割り当てられる小さな GUI を作成しようとしました。同じボタンを使用して、2 回目にクリックするとラベルを「新しいラベル」に変更し、3 回目にクリックすると再び元に戻したいと思いました。基本的に 1 または 0 の状態を保持する変数 x を持つ If/Else ステートメントを使用してこれを実行しようとしました。If/Else の各部分の最後で、x の状態を 1 または 0 に適切に変更します。ただし、プログラムをEclipseで実行しようとすると、何らかのエラーが発生しました。system.out を割り当てました。

質問:

  1. このような単純な 2 つの状態の切り替えを実行するのに、If/Else ステートメントは適切ですか?
  2. これを行うより適切な方法はありますか?(switch ステートメントについては知っていますが、これは 2 つの状態のプロジェクトに過ぎなかったため、これを選択しました)。
  3. 私は何を間違えましたか? 状態が 1 であるべきなのに、Else パスが達成されないのはなぜですか?

Pano さん、ご回答ありがとうございます。

4

4 に答える 4

3

変数「x」は、クラス メンバーとして宣言する必要があります。

public class event implements ActionListener{
    private int x = 0;

    public void actionPerformed(ActionEvent e){
        if(x == 0){
            label.setText("the new label");
            System.out.println("setting x to 0 and label to display a label");
            x = 1;
            System.out.println(x);
        }
        else {
            label.setText("newerer label");
            System.out.println("i reached the else segment");
            x = 0;
            System.out.println(x);
        }
    }
}
于 2013-04-19T20:20:59.043 に答える
1

xアクションリスナーが呼び出されるたびに初期化しているためx、常に0xです。別の場所に移動し、クラスメンバーとして宣言する可能性があります。

于 2013-04-19T20:20:47.963 に答える
0
  1. はい、個人的にはここで if/else ステートメントを使用しますが、状態をさらに追加する可能性がある場合は switch ステートメントが適切かもしれませんが、if/else ブロックに 1 行以上のコードがある場合は保持すると思います私の経験では、読みやすさが向上しているため、if/else のようです。

  2. 1に対する私の答えはこれをカバーしていると思います!

  3. else ブロックに到達していない理由は、 x 変数がそのメソッド内のスコープ内 (存在のみ) にあるためです。メソッドを離れるとすぐに、コードが関係している限り、値はスコープ内になくなります。P Lalonde が投稿したコードは、変数をメンバー変数 (オブジェクト スコープ) として持つ正しい方法を示しています。メンバー変数のスコープの詳細については、http: //docs.oracle.com/javase/tutorial/java/javaOO/variables.htmlを参照してください。

于 2013-04-19T20:25:24.473 に答える