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

Java 为什么我应该在addActionListener之前定义JLabel?,java,swing,Java,Swing,我有一个JLabel和一个JButton到JFrame。我为JButton的actionPerformed事件编写代码,如下所示: btnOK.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { lblA.setText("Hello"); // error here } }); final JLabel l

我有一个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
但是,如果我将JLabel的define放在addActionListener之前,如下面所示,我的问题就解决了:

final JLabel lblA = new JLabel("");
btnOK.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            lblA.setText("Hello"); // error here
        }
    });
另外,若我在它之后定义一个变量,我会得到类似的错误,我应该在它之前定义一个变量


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

除非您声明变量
lblA
,否则您计划如何使用它(它未定义)。编译器不会知道这样一个变量,除非它被声明

这就是为什么,当您将该代码放在
侦听器
上方时,您可以在其中使用该
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.

除非声明变量
lblA
,否则计划如何使用它(未定义)。编译器不会知道这样一个变量,除非它被声明

这就是为什么,当您将该代码放在
侦听器
上方时,您可以在其中使用该
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.

变量
按声明顺序定义。变量在声明之前未定义

变量
按声明顺序定义。变量在声明之前未定义

本地
变量取决于位置。若您在构造函数或方法之外定义变量,那个么位置将无关紧要。尝试以下声明:

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();
    }
}

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();
    }
}

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

OP的问题是关于声明位置。不是他或她是否应该申报……OP的问题是关于申报的立场。不是他或她是否应该声明…@Reimeus No所有变量,但局部变量保持顺序。是的,但如果你注意到Masud的回答,你可以看到lblA是在方法之后声明的。这样的声明仍然有效。@Reimeus没有所有变量,但是局部变量保持顺序。是的,但是如果你注意到Masud的回答,你可以看到lblA是在方法之后声明的。这样的声明仍然有效。