我是Java的新手。我搜索了这个,但没有找到明确的答案。
有没有办法在void方法中更改预定义变量的值,并使用另一个void方法的新值?
我需要的东西: 在Eclipse WindowBuilder中,单击按钮可以更改在此按钮之外定义的变量的值。 所以我可以在点击另一个按钮时使用新值。 但是,当我点击另一个按钮时,会使用最初定义的值,而不是更改的之一。
更新:示例代码:
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
String x = "0";
JButton btn1 = new JButton("Button 1");
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String x = "1";
textField1.setText(x);
}
});
btn1.setBounds(102, 134, 89, 23);
frame.getContentPane().add(btn1);
JButton btn2 = new JButton("Button 2");
btn2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField2.setText(x);
}
});
btn2.setBounds(232, 134, 89, 23);
frame.getContentPane().add(btn2);
textField1 = new JTextField();
textField1.setBounds(159, 85, 86, 20);
frame.getContentPane().add(textField1);
textField1.setColumns(10);
textField2 = new JTextField();
textField2.setColumns(10);
textField2.setBounds(159, 179, 86, 20);
frame.getContentPane().add(textField2);
}
因此x
初始化为"0"
。点击按钮1 ,将x
更改为"1"
。然后,点击按钮2 ,会显示初始值"0"
而不是"1"
。
答案 0 :(得分:2)
在您的代码中,您使用的是局部变量x
JButton btn1 = new JButton("Button 1");
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final String x = "1";
textField1.setText(x);
}
});
此变量不会存在于您已声明的内部类方法ActionListener.actionPerformed
之外。
您需要在符合您需要的范围内声明您的变量。
在这种情况下,您需要使用变量实例(请参阅下面的注释),因此请在方法String x
之外声明initialize
作为实例的一部分。
String x; //instance variable to be shared
private void initialize() {
...
JButton btn1 = new JButton("Button 1");
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
x = "1";
textField1.setText(x);
}
});
JButton btn2 = new JButton("Button 2");
btn2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField2.setText(x);
}
});
}
注意:您不能简单地将其放在initialize
方法中,因为您需要将其设置为final
以在内部类中使用,但您要为其设置值所以在你的情况下是不可能的。
PS:
请注意,您正在隐藏String x
方法的initialize
String x = "0";
JButton btn1 = new JButton("Button 1");
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String x = "1";
textField1.setText(x);
}
});
在click方法中,这不会使用当前x
的{{1}},它将是一个完全不同的实例(即使命名相同)。所以你需要删除那个声明,因为你要隐藏我刚刚声明的实例变量。
What are Shadow Variables in Java
但简短的说明是:
如果存在另一个具有更接近范围的同名变量
,则变量被遮蔽
显示此阴影的一个小例子是
"0"
答案 1 :(得分:1)
变量必须定义为类的实例变量,而不是方法中的局部变量。这样,所有按钮都能够访问变量,而不仅仅是那些封装在方法中的变量。
编辑:
这是一些示例代码,用于准确显示我的意思。 目前您正在定义变量x,如下所示:
final void initialize(){
String x = "0"; //x is defined within the scope of this method only.
}
这会将变量x约束为仅存储在initialize方法中。但是,对于您的情况,您可能希望将x定义为:
String x; //Instance variable which is available to the entire class
final void initialize(){
x = "0"; //modifies the instance variable for the entire class
}
答案 2 :(得分:0)
您正在声明一个新变量x,这就是问题所在。相反,您应该更改x并将其定义为成员变量(如IQV在此答案下面的注释中所述)。
public void actionPerformed(ActionEvent e) {
final String x = "1"; // this should be x = "";
textField1.setText(x);
}