我有一个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#中我可以在一个方法之后定义变量并将变量用于方法。
答案 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
。这就像使用不存在的东西一样,第二种方式是正确的形式。