更改要在 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 
}