Java基本if/else语句状态改变



请参阅下面附带的代码,最后是我的问题。

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并试图理解一个概念。使用这个程序,我试图创建一个带有按钮的小gui,当单击该按钮时,该按钮将为JLabel分配"新标签"的String值。我想使用相同的按钮,但改变标签为"新标签",如果点击第二次和再次点击第三次。我尝试使用带有变量x的If/Else语句来保持1或0的状态。在If/Else的每个部分结束时,我将x的状态适当地更改为1或0。然而,当尝试在eclipse中运行程序时,我遇到了某种错误。我为If/Else的每个部分分配了system.out.println,试图查看程序如何在这两种状态之间切换,但似乎从未到达我的Else语句。

问题:

  1. If/Else语句是否适合执行这种简单的2状态切换?
  2. 是否有更合适的方法来做到这一点?(我知道关于开关语句,但选择了这个,因为它只是一个两状态的项目)。
  3. 我做错了什么,为什么当状态应该是1时,我的Else路径从未实现?

谢谢你的回复,帕诺人

变量"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);
        }
    }
}

每次调用操作侦听器时都初始化x,因此x始终为0。将x移到其他地方,可能将其声明为类成员

  1. 是的,我个人会在这里使用if/else语句,虽然如果你可能会添加更多的状态切换语句可能是合适的,但我认为如果你在if/else块中有超过1行代码,我会把它保持为if/else,因为它在我的经验中具有更好的可读性。

  2. 我想我对1的回答涵盖了这个!

  3. 你的else块没有被到达的原因是你的x变量只在该方法的作用域中(只存在)。一旦您离开该方法,该值就不再在作用域中,因此就您的代码而言,它不再存在。P Lalonde张贴的代码显示了正确的方法:将变量作为成员变量(对象范围)。在这里阅读更多关于成员变量作用域的信息:http://docs.oracle.com/javase/tutorial/java/javaOO/variables.html

如果你只是在寻找状态切换,你可以这样做:

if( label.getText().equals("the new label") ) {
  label.setText("newerer label");
} else {
  label.setText("the new label");
}

最新更新