2011-05-27 29 views
3

將某個類專用於特定的Swing組件時,最好是指定該特定組件,還是在內部構建它並提供參考?關於Swing組件擴展,什麼是經驗法則?

public class Foo extends JComponent{ 

} 

OR

public class Foo{ 
    public JComponent getComponent(){ 
    } 
} 

編輯

這就是我所說的

public class Foo{ 
    private static Foo INSTANCE; 

    public static Foo getInstance(){ 
     if(INSTANCE == null){ 
      INSTANCE = new Foo(); 
     } 
    } 

    public void createAndShowComponent(){ 
     //do stuff 
    } 
} 

createAndShowComponent(),我創建了一個JComponent及其所有組件和它們各自的偵聽器而不是暴露了剛剛創建的組件的內部。

+1

看到一些我不完全同意的答案我必須問你這個「獻給」是什麼意思? ....一個特定的Swing組件的類。 – Boro 2011-05-27 17:48:14

回答

7

+1對於構成擴展。它使得API更清潔,因爲你只公開哪些方法對你的新組件很重要

+0

+1,擴展Swing組件的風險正是我問這個問題的原因。 – mre 2011-05-27 17:39:17

+4

我不認爲這是一個強硬的規則。如果你想讓一個通用組件在很多地方使用,那麼一定要擴展任何JComponent,但是如果它是一個單獨的應用程序的獨立類,我認爲這個應用程序最常用,而不是它極大地分離了你的應用程序的一部分來使用組合並創建一個乾淨的API – meverett 2011-05-27 17:51:54

+0

+1。當你需要作文時(大部分時間)使用作文。當你實現一個新的組件時(比如分頁的JTable),使用擴展。這裏的例外是擴展JApplet(因爲我們也需要)。 – 2011-05-27 17:53:25

1

這真的取決於你在做什麼。例如,如果您想將新類包含在JPanel中,則需要擴展該組件。如果您的代碼可以將組件添加到GUI上的正確位置,那麼您不必擴展它。

+0

,我能不能在類中爲該組件提供一個訪問器? – mre 2011-05-27 17:35:22

+0

@mre,你絕對可以喜歡你的第二個例子。但是,你可能會在你的新類和需要JComponent的類之間有一些額外的耦合。有時候它可以大大簡化你的代碼來擴展組件。 – jzd 2011-05-27 17:38:49

1

我會說他們都沒有。 Swing組件非常(非常)豐富,可以以任何方式定製可視化(L & F)和行爲(事件)。另一點是創建一組不同的組件並將它們放在JPanel中。

+0

既不辦法?那麼你如何去創建Swing組件? – mre 2011-05-27 17:37:31

+0

我不會,我會「配置」他們。恕我直言,Swing編程並不意味着「延長我」,這意味着「使用和配置我」。取決於你的用例,但要注意開始擴展Swing以外的東西...... – PeterMmm 2011-05-27 17:48:31

+0

@mre所以'奉獻'一個類意味着'創造'一個新的組件? – Boro 2011-05-27 17:49:49

3

我同意jzd這一切都取決於。從技術上講,如果你在處理GUI時,我認爲最好是在你需要的時候構建組件,例如擴展JComponent等等組件。這樣你可以簡單地重用它們。

就我個人而言,我絕對不會在我的班級中使用第二個選項。只有在有充分理由的情況下,我纔會有一個類返回另一個組件。使用戶能夠修改複雜日曆組件中的按鈕外觀。

出於一個非常簡單的原因,每個組件類應該知道它具有這個組件,並且它應該相應地控制視圖以發生什麼。因此你會有適當的方法。

2

我想說延長它會更好。能夠使用它的所有屬性並像使用它一樣,該對象使得它更容易使用。只是我的個人意見。兩種方式都很好。

如果你正致力於整個班級。也可以通過繼承來實現。

2

如果你的對象是一個組件,比擴展它。如果不是,則使用合成。