2009-12-26 61 views
7

我做了一個Swing應用程序,它的功能相當簡單。但是,我認爲它所組成的代碼變得相當龐大和非常混亂。所有的擺動組件和動作都在一個文件中。因此,舉例來說,如果我想用更多功能創建更大的應用程序,代碼將很難通過。有關Java Swing的一般問題

所以我的問題是如何使一個良好的代碼結構。或者如果有一個很好的網頁,我可以閱讀它,如果可能的話還有一些代碼示例。我已經檢查了Sun關於Swing的教程,但是他們展示了一些相當簡單的例子。

更新:我琢磨了一會兒,並檢查了一些例子。我不知道我是否得到了正確的MVC模式。無論如何,我的想法是將每個JFrame分離到他們自己的類文件中。之後,我有一個MainFrame,它是應用程序的主窗口。從該JFrame中,我創建了每個JFrame的一個實例。並用Actions來調用MainFrame中的那些幀。我不知道這是不是一個好主意。但是,它使代碼顯着易於閱讀。

這裏是我如何意味着

class Main implements ActionListener { 

    private JFrame frame = new JFrame(); 
    private JButton button1 = new JButton(); 
    private JPanel panel = new JPanel(); 

    private FirstFrame frame1 = new FirstFrame(); 
    private SecondFrame frame2 = new SecondFrame(); 
    private ThirdFrame frame3 = new ThirdFrame(); 

    public Main() { 
     button1.addActionListener(this); 
    } 

    public createGUI() { 
     frame.setTitle("Main"); 
     frame.setSize(400,300); 
     panel.add(button); 

     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
    } 

    public static void main(String args[]) { 
     new Main().createGUI(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == button1) 
     { 
      frame1.enable(); 
     } 
    } 
} 
+1

偉大的問題!我一直在思考這個問題。 – 2009-12-26 11:21:13

回答

8

使用Model-View-Controller design pattern.它與業務邏輯分離的用戶界面代碼交易的例子。

編輯:

由於OP是尋找有組織的代碼,而不是靈活的設計,我已刪除了NetBeans UI設計部分來自我的答案。

+0

我已經使用Eclipse的可視化UI插件,但我的經驗是它會添加很多廢料代碼。 Netbeans的情況是否如此? – starcorn 2009-12-26 11:05:37

+0

但是,如果有資源需要閱讀,我還想學習手動編碼 – starcorn 2009-12-26 11:06:12

5

考慮到每個應用程序都有相同的問題,組織任何重要大小的用戶界面代碼都是一個令人驚訝的寫少的問題。有一些技巧可以幫助:

  1. 重構 - 在代碼變得不整齊後清理。
  2. 模型視圖控制器模式 - 分離關注點。
  3. OO設計 - 使用許多小型協作類而不是大塊代碼。
  4. 「On event Do action」 - 用於將操作與視圖分離的習慣用法。
  5. UML組件模型 - 可視化類級別以上的設計概念。
  6. 依賴倒置原則 - 組織代碼依賴關係。

的基本設計技術已經存在了相當長的一段時間,並且是很好理解的,但應用的技術在更大的範圍是什麼,似乎是單獨設計爲每個應用程序。

我看到有效應用的一種方法是將事件,監聽器,操作等分離到它們自己的類中,並按類型將它們組織成包,或者在包之間使用一致的命名約定,以便組件和它的關聯類很容易識別(XDialog,XDialogMouseListener,XDialogCancelAction等)。

另一種方法是查看一些大型的開源應用程序(Eclipse,Firefox,...),並查看它們如何組織它們的GUI代碼。

+0

如何分離代碼?因爲我有一些看法。這取決於行動,因此我不能把它分開。 – starcorn 2009-12-26 11:22:49

+0

如果您從視圖中拆分某個操作並且不再編譯,那麼您可以引入額外的方法來允許單獨的類訪問缺少的功能。額外的方法應該被組織到接口中。如果方法不應該公開可用,那麼可以使用包級訪問來聲明該接口。 – richj 2009-12-26 11:36:12

+0

MVC視圖通常不會依賴於動作,儘管在MV2中視圖和控制器可以更緊密地耦合。通過介紹接口,您可以使用依賴性反轉原理來顛倒任何錯誤方向的依賴關係。 – richj 2009-12-26 11:40:00

2

我傾向於儘可能多地從Swing組件中提取非GUI相關的功能。這意味着你有一些額外的間接。但是:

  1. Swing的層不只是GUI交互
  2. 業務功能是一個更容易測試和維護。因此

我不一定在談論一個完整的MVC模式(儘管這不是壞事)。這更像是一個班級/包裹組織問題。

+0

+1爲實用主義,我做同樣的事情。特別是使用像JFormDesigner這樣的GUI設計器,可以很容易地爲按鈕添加動作和動作處理程序等等。在一個類中調用helper類是很有意義的。例如,我的打印動作只是一個調用新的PrintTask()。print(myJob)的包裝器。 PrintTask是一個單獨的(不是內部的)類,它與GUI無關。 – 2009-12-26 20:06:16

1

要讓你放心的是UI編程就像其他類型的編程一樣。不要以爲它是特殊的,你可以忽略明智的做法。不幸的是,大多數教程代碼非常糟糕,生產中的代碼大概會變得更糟。

要點:

  • 使用分層設計。這不僅僅是persistence-business-ui。將它分割更細。例如,佈局圖層不應創建組件(除佈局外,通常爲JPanel s)。
  • 更喜歡繼承的組合。對於JFrameJPanel這樣的子類有很小的意義,所以不要這樣做。
  • 保持界面精簡。舉例來說,渲染器應該沒有什麼邏輯。一方面,這使測試變得更容易(這是自動化測試,手工進行大規模測試會適得其反)。