Java 为什么我应该在addActionListener之前定义JLabel?
我有一个JLabel和一个JButton到JFrame。我为JButton的actionPerformed事件编写代码,如下所示: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
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是在方法之后声明的。这样的声明仍然有效。