2014-12-04 39 views
0

我試圖找到一個類似的查詢,但不能因此iam發佈此。 我的工作已經作出了一些類似的JButton,JComboBox的等組件的GUI Swing應用程序基於一些業務邏輯在運行時顯示/隱藏擺動組件的良好設計模式

我有,我有以下的情況

  1. 常見的一個重要的商業案例組件集應該在任何時候都可以看到
  2. 中的組件集這並不適用於一定的情況下應該被隱藏
  3. 的一套適用應顯示在除了什麼共同組成的
  4. 有一個要求,我將不得不在JavaFX中重做此應用程序,因此有一種方法可以使此代碼獨立於Swing技術,這是非常好的。

方法1:在GUI類中有單獨的方法來隱藏/取消隱藏組件,並讓視圖/控制器根據場景來處理它。然而,這取決於視圖,並且必須從頭開始編寫,一旦我移動到JavaFX

方法2:定義一個規則集,它基本上包含可以隱藏的類的屬性名稱並讓它一段常見的代碼通過利用反射來隱藏/取消隱藏它。這與使用的視圖技術的類型無關。 但是,在代碼審查過程中反射的使用總是引起人們的注意,因爲推薦的做法是儘量避免使用它,因此要讓人們相信它有點困難。

在這種情況下,在複雜性與代碼重用與涉及的工作方面使用什麼方法是一種好方法? 也有一種設計模式,可以在這種情況下有所幫助嗎?

感謝您的幫助!

+0

*「有一個要求,我將不得不在JavaFX中重做此應用程序,因此..」* ..它幾乎與Swing無關。 – 2014-12-04 07:03:29

+0

@AndrewThompson:如果我決定使用第一種方法,我會重寫代碼來隱藏組件,這就是我所指的。對於ex comp1.setVisible(false)將不得不爲所有此類組件重寫 – 2014-12-04 07:11:23

+0

如果它是Swing,則使用「Action」對象,如果不相關則禁用它們。 – 2014-12-04 07:16:20

回答

0

爲了降低複雜性並實現代碼重用性,使用XML文件來定義佈局而不是硬編碼更好。我建議你使用SwiXML來促進Java Swing的構建。詳見http://www.swixml.org/

+0

如何解決問題,因爲無論我如何構建視圖,邏輯都必須寫入某個位置。 – 2014-12-04 07:15:13

+0

通過SwiXML構建View之後,可以使用SwiXML來調用構建的組件。對於我的練習,我使用Spring將Listener創建爲bean,以將組件和偵聽器鏈接在一起。 – 2014-12-05 04:24:26

1

使用接口,盧克。爲您使用的swing組件定義自己的擴展或(更好的)包裝,並提供可以使用JavaFX實現的常用操作。因此,您可以實施常見操作,使GUI的部分可見/不可見。另外,您應該將組件分組爲邏輯部分,併爲這些組提供與技術無關的子控制器/子模型。相應的視圖應該有一個方法使自己(in)可見。對於Swing:如果你想使GUI(視圖)的一部分不可見,你應該使用CardLayout(一個卡與你的組件和另一個卡與一個空白麪板)。方法setVisible可能導致佈局問題。

0

以我的解決方案,我使用:

JPanel mainPanel = new JPanel(new BorderLayout()); 

與其中Long使用JPanel S之間進行區分的背襯HashMap<Long,JPanel>。然後,當做出一個選擇,我做的:

mainPanel.remove(oldPanel); 
mainPanel.add(newPanel, BorderLayout.CENTER); 

HashMap中保持我的組件的參考,因此他們不是垃圾回收,這避免了問題,使用setVisible可以創建。