2012-04-10 38 views
0

我剛剛嘗試學習和搞亂代碼。我遇到了一些我不希望發生的事情。我在MainApp類中有一個JLabel,我創建了一個傳遞JLabel的ActionListener(HelloListener)。當按下按鈕時,actionPerformed方法應該將JLabel更新爲「再次Hello!」。它確實如此,但它爲什麼會讓我困惑。Java - ActionListener類的變量一致性..爲什麼這個工作?

不過,我想我會返回新JLabel的?當我傳遞HelloListener JLabel時,是不是JLabel在HelloListener類的屬性通過後?所以當它更新時它只會更新HelloListener中的一個,然後我將不得不返回它?

爲什麼當我更新了的JLabel的HelloListener它也是在MainApp類更新?

下面的代碼:

public class MainApp extends JFrame { 

    public static void main(String[] args) { 

     new MainApp(); 

    } 

    public MainApp() { 

     setLayout(new GridLayout (2,1)); 

     setSize(200,200); 

     JLabel jl = new JLabel("Hello!"); 
     add(jl); 

     JButton jb = new JButton("Click me!"); 
     jb.addActionListener(new HelloListener(jl)); 
     add(jb); 

     setVisible(true); 

    } 

} 

public class HelloListener implements ActionListener { 

    JLabel jl; 

    public HelloListener(JLabel jl) { 
     this.jl = jl; 
    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     jl.setText("Hello again!"); 
    } 

} 
+0

看看我的[對類似問題的回答](http://stackoverflow.com/a/10077580/544963)以獲取有關如何執行此操作的說明。如果您需要進一步的幫助,請詢問。 :) – fireshadow52 2012-04-10 12:34:29

回答

3

當我通過HelloListener選擇JLabel,這不就是JLabel中的HelloListener類的 屬性後,它傳遞?所以當它更新它只會更新它在HelloListener中的一個,然後我會 不得不返回它?

這是在你的理解中細分。當你「傳遞的JLabel」,要傳遞一個參考JLabel的(你實際上是路過的價值,你應該只要你瞭解你目前的問題查找的參考,因爲它是與Java很重要) 。底層對象實例在以前的任何地方仍然存在。所以在HelloListener實例JLabel jl僅僅是一個參考到在GUI顯示相同的實際JLabel實例

這是對Java(和很多編程語言)是如何工作的根本。如果你

Dog d = new Dog();

,然後通過d的方法

walk(d);

walk看起來像

public void walk(Dog dog) { 
    dog.setLastWalkTime(now()); 
    dog.attachLeash(); 
} 

的方法dog,並d在呼叫範圍,都指向相同的Dog實例。所以就像您設置lastWalkTime一樣,底層實例也會被修改。如果正好在walk之後,您看了d,您會看到您在該方法中設置的lastWalkTime值。

+0

很好的解釋! – Tim 2012-04-10 12:44:59

+1

謝謝。我希望你明白。查看「按值傳遞Java」,這可能是新手對Java最容易被誤解和困惑的部分。 – hvgotcodes 2012-04-10 12:45:53

0

爲什麼你會期望返回新的JLabel? (然後是什麼?刪除舊的,添加新的,讓你的窗口再次進行佈局?)你傳遞給監聽器的JLabel實例用作JLabel的引用,這就是它的優點 - 你正在修改你現有的實例。

1

當一個函數將一個對象作爲參數時,它將被傳遞給該對象的引用。在你的代碼中,MainAppHelloListener都有對同一個JLabel實例的引用。

當調用actionPerformed()時,偵聽器將修改實例的屬性。由於JFrame可以訪問同一個實例,因此它會檢測到更改並更新GUI。

相關問題