2013-10-03 27 views
0

我有一個JLabel和一個JButton到JFrame中。我寫的JButton的的actionPerformed事件類似的代碼如下:爲什麼我應該在addActionListener之前定義一個JLabel?

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

,但我得到以下錯誤:

lblA cannot be resolved 
然而

,如果我把一個JLabel的定義addActionListener方法,像現在這樣關注我的問題解決了:

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

此外,如果我後面定義一個變量,我得到類似的錯誤,我應該在它之前定義變量。

但是在C#中,我可以在一個方法之後定義一個變量並將變量用於方法。

回答

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

謝謝,非常好! –

+0

不客氣。 – Masudul

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. 
+0

OP的問題是關於聲明的位置。不是他或她是否應該聲明... – Thihara

+0

現在它是有道理的... – Thihara

+0

@Thihara - 給了更新! :) – SudoRahul

1

variables按照它們聲明的順序確定。該變量在聲明之前是未定義的

+0

我的回答編輯 –

+1

@Reimeus沒有所有的變量,但局部變量維持秩序。 – Masudul

+0

是的,但如果你注意到Masud的回答,你可以看到lblA是在方法之後聲明的。像這樣的聲明仍然有效。 – Thihara

0

僅僅因爲你acessing參考,lblA,其聲明之前。這就像使用不存在的東西,所以,第二種方式是正確的形式。

相關問題