0

我在 JFrame 中有一个 JLabel 和一个 JButton。我为 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

4 回答 4

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();
    }
}
于 2013-10-03T10:44:30.460 回答
1

variables是按照它们被声明的顺序定义的。变量在声明之前是未定义的

于 2013-10-03T10:37:49.380 回答
1

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

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

例如:-

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.
于 2013-10-03T10:35:45.020 回答
0

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

于 2013-10-03T10:44:33.897 回答