更改要在 Java 外部使用的 void 方法内的变量值?
Changing a variable value inside a void method to be used outside in Java?
我是 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"
。
您正在声明一个新变量 x,这就是问题所在。相反,您应该更改 x 并将其定义为成员变量(如 IQV 在此答案下方的评论中所说)。
public void actionPerformed(ActionEvent e) {
final String x = "1"; // this should be x = "";
textField1.setText(x);
}
在您的代码中,您使用的是局部变量 x
JButton btn1 = new JButton("Button 1");
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final String x = "1";
textField1.setText(x);
}
});
此变量不会存在于您声明的 class 方法 ActionListener.actionPerformed
之外。
您需要在符合您需要的范围内声明您的变量。
在这种情况下,您需要使用变量实例(见下面的注释),因此在方法 initialize
之外声明 String x
是实例的一部分。
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
放在内部 class 中使用,但你正在设置一个值,因此在您的情况下是不可能的。
PS :
请注意,您正在跟踪 initialize
方法String x
String x = "0";
JButton btn1 = new JButton("Button 1");
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String x = "1";
textField1.setText(x);
}
});
在点击方法中,这将不会使用当前"0"
的x
,它将是一个完全不同的实例(即使有相同的名称)。所以你也需要删除那个声明因为你会隐藏我刚刚声明的实例变量。
What are Shadow Variables in Java
但简短的描述是:
A variable is shadowed if there is another variable with the same name that is closer in scope
显示此阴影的一个小示例是
public class Main {
String x = "a";
public static void main(String[] args) {
new Main();
}
public Main(){
System.out.println(x); //"a"
String x = "b";
System.out.println(x); //"b"
new Thread(new Runnable() {
public void run() {
String x = "c";
System.out.println(x); //"c"
}
}).start();
System.out.println(x); //"b"
}
public void method(){
System.out.println(x); //"a"
}
}
变量必须定义为 class 的实例变量,而不是方法中的局部变量。这样,所有按钮都将能够访问变量,而不仅仅是那些封装在方法中的按钮。
编辑:
这里有一些示例代码可以准确说明我的意思。
当前您正在这样定义变量 x:
final void initialize(){
String x = "0"; //x is defined within the scope of this method only.
}
这将变量 x 限制为仅存储在初始化方法中。但是,对于您的情况,您可能希望这样定义 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
}
我是 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"
。
您正在声明一个新变量 x,这就是问题所在。相反,您应该更改 x 并将其定义为成员变量(如 IQV 在此答案下方的评论中所说)。
public void actionPerformed(ActionEvent e) {
final String x = "1"; // this should be x = "";
textField1.setText(x);
}
在您的代码中,您使用的是局部变量 x
JButton btn1 = new JButton("Button 1");
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final String x = "1";
textField1.setText(x);
}
});
此变量不会存在于您声明的 class 方法 ActionListener.actionPerformed
之外。
您需要在符合您需要的范围内声明您的变量。
在这种情况下,您需要使用变量实例(见下面的注释),因此在方法 initialize
之外声明 String x
是实例的一部分。
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
放在内部 class 中使用,但你正在设置一个值,因此在您的情况下是不可能的。
PS :
请注意,您正在跟踪 initialize
方法String x
String x = "0";
JButton btn1 = new JButton("Button 1");
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String x = "1";
textField1.setText(x);
}
});
在点击方法中,这将不会使用当前"0"
的x
,它将是一个完全不同的实例(即使有相同的名称)。所以你也需要删除那个声明因为你会隐藏我刚刚声明的实例变量。
What are Shadow Variables in Java
但简短的描述是:
A variable is shadowed if there is another variable with the same name that is closer in scope
显示此阴影的一个小示例是
public class Main {
String x = "a";
public static void main(String[] args) {
new Main();
}
public Main(){
System.out.println(x); //"a"
String x = "b";
System.out.println(x); //"b"
new Thread(new Runnable() {
public void run() {
String x = "c";
System.out.println(x); //"c"
}
}).start();
System.out.println(x); //"b"
}
public void method(){
System.out.println(x); //"a"
}
}
变量必须定义为 class 的实例变量,而不是方法中的局部变量。这样,所有按钮都将能够访问变量,而不仅仅是那些封装在方法中的按钮。
编辑:
这里有一些示例代码可以准确说明我的意思。 当前您正在这样定义变量 x:
final void initialize(){
String x = "0"; //x is defined within the scope of this method only.
}
这将变量 x 限制为仅存储在初始化方法中。但是,对于您的情况,您可能希望这样定义 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
}