在void方法中更改要在Java外部使用的变量值?

时间:2017-02-15 06:34:09

标签: java eclipse windowbuilder

我是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);
    }

enter image description here

因此x初始化为"0"。点击按钮1 ,将x更改为"1"。然后,点击按钮2 ,会显示初始值"0"而不是"1"

3 个答案:

答案 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);
}