2016-10-20 66 views
1

我正在關注Swing教程,並且發現了兩種方法可以使下面的代碼工作。基本上我們正在創建一個框架,並在其中放置按鈕和文本區域。據我所知,他們可以實現相同的功能,但我很好奇底下的區別在哪裏,或者對於大型項目來說是一種更好的方法。Java Swing傳遞類vs匿名類的實例

這是它在本教程中的顯示方式:

public class MainFrame extends JFrame { 

    private TextPanel textPanel; 
    private ButtonPanel buttonPanel; 

    public MainFrame(String title){ 
     this.setTitle(title); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setSize(800,600); 
     this.setLayout(new BorderLayout()); 


     this.textPanel = new TextPanel(); 
     this.buttonPanel = new ButtonPanel(); 

     this.buttonPanel.setTextListener(new TextListener(){ 
      public void deliverText(String text) { 
       textPanel.appendText(text); 
      } 
     });  

     this.add(textPanel, BorderLayout.CENTER); 
     this.add(buttonPanel, BorderLayout.SOUTH); 
     this.setVisible(true); 
    } 

這是另一種方法,同時與代碼瞎搞,我發現:

public class MainFrame extends JFrame implements TextListener{ 

    private TextPanel textPanel; 
    private ButtonPanel buttonPanel; 

    public MainFrame(String title){ 
     this.setTitle(title); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setSize(800,600); 
     this.setLayout(new BorderLayout()); 

     this.textPanel = new TextPanel(); 
     this.buttonPanel = new ButtonPanel(); 
     this.buttonPanel.setTextListener(this); 

     this.add(textPanel, BorderLayout.CENTER); 
     this.add(buttonPanel, BorderLayout.SOUTH); 
     this.setVisible(true); 
    } 

    public void deliverText(String text){ 
     this.textPanel.appendText(text); 
    } 

} 

的TextListener是基本上之間進行通信的接口一個按鈕和文本區域,以便按下按鈕時,該按鈕內的文本將出現在文本區域中。

這些方法中的哪一種都被認爲是更好的方法?實際上我有沒有意識到的顯着差異?

對我來說,似乎第二種方法(其中MainFrame實現TextListener)可能是一種更爲昂貴的方式來處理事情,因爲當真正需要的全部內容是關於TextListener的信息時,我們正在傳遞整個MainFrame實例。我想在一個更大的程序中,MainFrame裏面有很多組件,這會開始成爲一個問題。這是考慮它的正確方法嗎?當我傳遞參數「this」是MainFrame創建的浪費內存的副本或者是原始副本引用的相同內存位置?

+1

添加'this'時,您不添加整個'frame',您只需傳遞* reference * ...因此它不會**增加尺寸... –

+0

這裏沒有具體問題 - 你如何設計你的應用程序強烈依賴於你的應用程序的目的 - 如果你只是想通過按下一個按鈕添加一些文本到文本字段,那麼你應該只編碼(第一種方式) - 如果你有其他目的而不是*只是添加文字*也許另一種方法更好。 –

回答

2

既然你在這裏有一個簡單的例子,它真的不是你使用的問題。

還有第三種選擇 - 創建一個獨立的類來自行實現接口。該選項允許爲偵聽器定義構造函數。有時候這很有用。

現在,this只是一個參考,所以沒有複製,所以沒有更多的內存使用。我認爲不實例化一個匿名類需要的資源較少。

基本上,我是如何解釋這種方法是當有許多不同的按鈕都添加爲this作爲接口。在接口方法的實現中,使用if語句檢查按鈕的來源。與爲每個組件添加單獨的匿名類來處理相同的事件相比,這佔用的資源更少。

+0

您能否給出一個例子,說明您在最後一段中的含義,添加了許多不同的按鈕作爲界面。 –

+0

請看這裏。 2個按鈕。 1接口。你還可以添加一個if語句到actionPerformed方法來檢查哪個按鈕被點擊。 https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/events/MultiListenerProject/src/events/MultiListener.java –

0

如果它有利於您的代碼追加除按鈕之外的其他位置的文本,請使用非匿名方法void deliverText(String text)

否則請使用anon TextListener。唯一的缺點是你在編譯的類/ JAR集中會有一個額外的.class文件。