为什么我应该在addActionListener之前定义JLabel?

时间:2013-10-03 10:34:15

标签: java swing

我有一个JLabel和一个JButton到JFrame中。我为JButton的actionPerformed事件编写代码如下:

btnOK.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            lblA.setText("Hello"); // error here
        }
    });
final JLabel lblA = new JLabel("");

但我得到以下错误:

lblA cannot be resolved

但是如果我在addActionListener之前放置了JLabel的定义,就像我的问题解决了一样:

final JLabel lblA = new JLabel("");
btnOK.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            lblA.setText("Hello"); // error here
        }
    });

此外,如果我在它之后定义一个变量,我会得到类似的错误,我应该在它之前定义变量。

但是在C#中我可以在一个方法之后定义变量并将变量用于方法。

4 个答案:

答案 0 :(得分:2)

Local变量取决于位置。如果在构造函数或方法之外定义变量,则位置无关紧要。请尝试以下声明:

public class X extends JFrame{

    X(){
          JButton btnOK=new JButton("OK");

        btnOK.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            lblA.setText("Hello"); // error here
        }
    });
     //        final JLabel lblA = new JLabel("");
    }

    JLabel lblA = new JLabel("");// Try to declare here outside of constructor.

    public static void main(String[] args){
        new X();
    }
}

答案 1 :(得分:1)

除非您声明变量lblA,否则您打算如何使用它(未定义)。除非声明,否则编译器不会知道这样的变量。

这就是为什么当您将代码置于listener之上时,您可以在其中使用lblA(因为lblA现在已知)。因此,您只能在声明后使用变量。如果你在此之前尝试使用它,它将是未定义的并将抛出编译错误(该变量无法解析)。

<强> E.g: -

System.out.println(test); // Print what? I don't know who or what test is.
String test = "I'm a String"; // Test variable declaration.

在撤销订单时,

String test = "I'm a String"; // Test variable declaration.
System.out.println(test); // I know test. I'll print it.

答案 2 :(得分:1)

variables按声明的顺序定义。在声明

之前,变量是未定义的

答案 3 :(得分:0)

仅仅因为您在声明之前访问了引用lblA。这就像使用不存在的东西一样,第二种方式是正确的形式。