请参阅下面附带的代码,最后是我的问题。
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语句。
问题:
- If/Else语句是否适合执行这种简单的2状态切换?
- 是否有更合适的方法来做到这一点?(我知道关于开关语句,但选择了这个,因为它只是一个两状态的项目)。
- 我做错了什么,为什么当状态应该是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
移到其他地方,可能将其声明为类成员
-
是的,我个人会在这里使用if/else语句,虽然如果你可能会添加更多的状态切换语句可能是合适的,但我认为如果你在if/else块中有超过1行代码,我会把它保持为if/else,因为它在我的经验中具有更好的可读性。
-
我想我对1的回答涵盖了这个!
-
你的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");
}