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

Java基本if/else语句状态更改,java,swing,if-statement,actionlistener,jlabel,Java,Swing,If Statement,Actionlistener,Jlabel,请看下面我的附加代码,然后在最后看我的问题 class events extends JFrame{ private JLabel label; private JButton button; public events() { setLayout(new FlowLayout()); button = new JButton("Click for text"); add(button); label

请看下面我的附加代码,然后在最后看我的问题

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分配“新标签”的字符串值。但是,我想使用相同的按钮,如果第二次单击,则将标签更改为“新标签”,如果第三次单击,则再次单击。我尝试使用带有变量x的If/Else语句来实现这一点,以保持基本上为1或0的状态。在If/Else的每个部分末尾,我将x的状态适当地更改为1或0。然而,当试图在eclipse中运行该程序时,我遇到了某种错误。我为If/Else的每一部分分配了一个system.out.println,试图查看程序如何在这两种状态之间切换,但似乎从未到达我的Else语句

问题:

  • If/Else语句是否适合执行这样一个简单的2状态切换
  • 有没有更合适的方法?(我知道switch语句,但选择了它,因为它只是一个两个州的项目)
  • 我做错了什么?为什么当状态应该为1时,我的Else路径从未实现
  • 谢谢你的回复,
    Pano

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

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

    必须将变量“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”必须声明为类成员

    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);
            }
        }
    }
    
  • 是的,我个人会在这里使用if/else语句,尽管如果您可能要添加更多的状态,switch语句可能是合适的,但我认为如果if/else块中有超过1行代码,我会将其保持为if/else,因为根据我的经验,它具有更好的可读性

  • 我想我对1的回答涵盖了这一点

  • 无法访问else块的原因是x变量仅在该方法内的作用域中(仅存在)。一旦您离开该方法,该值就不再在范围内,因此就您的代码而言,它不再存在。发布的代码P Lalonde显示了正确的方法:将变量作为成员变量(对象范围)。在此处阅读有关成员变量作用域的更多信息:

  • 是的,我个人会在这里使用if/else语句,尽管如果您可能要添加更多的状态,switch语句可能是合适的,但我认为如果if/else块中有超过1行代码,我会将其保持为if/else,因为根据我的经验,它具有更好的可读性

  • 我想我对1的回答涵盖了这一点

  • 无法访问else块的原因是x变量仅在该方法内的作用域中(仅存在)。一旦您离开该方法,该值就不再在范围内,因此就您的代码而言,它不再存在。发布的代码P Lalonde显示了正确的方法:将变量作为成员变量(对象范围)。在此处阅读有关成员变量作用域的更多信息:


  • 如果您只是在寻找状态切换,您实际上可以执行以下操作:

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

    如果您只是在寻找状态切换,您实际上可以执行以下操作:

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

    您可以看到,您总是会命中第一个if(x==0),就像您在将x设置为0之前一样。@MrSimpleMind,+1用于仔细检查!这是大量的代码。您应该编辑代码示例,只包含与您的问题相关的内容。(通常是输入/输出/GUI代码。)@millimoose,显示整个代码不合适吗?根据D先生的回答,另一个观察者可能不知道在我的代码中,在哪里声明x更合适。如果不是这样,那么我道歉,不会再这样做了。这毕竟是我的第一篇帖子。@Warmonger0你解决了吗?你看到你总是会命中第一个if(x==0),就像你刚才把x设为0一样。@simplemin先生,+1,以供仔细检查!这是大量的代码。您应该编辑代码示例,只包含与您的问题相关的内容。(通常是输入/输出/GUI代码。)@millimoose,显示整个代码不合适吗?根据D先生的回答,另一个观察者可能不知道在我的代码中,在哪里声明x更合适。如果不是这样,那么我道歉,不会再这样做了。这毕竟是我的第一篇帖子。@Warmonger0你解决了吗?好的,我理解你的评论,D先生,你说每次调用动作侦听器时我都初始化x。在JButton之后将其声明为私有变量是否合适?实际上,不,如果在另一个类中声明为私有,您将无法访问它好的,我理解您的评论,D先生,您说每次调用action listener时我都初始化x。在JButton之后将其声明为私有变量是否合适?实际上,不,如果在另一个类中将其声明为私有,您将无法访问它。不,不。应用程序状态应该是抽象的,并且与GUI中显示的内容分开。不,不。应用程序状态应该是抽象的,并且与GUI中显示的内容分开。