2010-01-23 44 views
4

我已經通過Netbeans Swing GUI創建者在Netbeans中創建了一個GUI。所以我只是從「調色板」窗口拖放Swing組件,所有的代碼都是由netbeans生成的。如何重構Netbeans生成的GUI代碼?

現在代碼太長,無法維護(約10,000行)。所以有些專家建議我重構我的代碼。

我可以重構,是由我生成的代碼,但我不知道如何重構由Netbeans的生成的代碼,因爲它不允許在其生成的代碼編輯。

有什麼建議嗎?

+0

實際上是有多少10.000線中產生?約 – 2010-01-23 10:31:45

+0

約。 8500行是生成代碼... rest是我在ActionPerformed方法的diff中編寫的代碼。 JButtons .. – 2010-01-23 10:34:41

+0

請參閱我編輯的答案 – 2010-01-23 10:45:16

回答

2

好 - 如果生成的代碼,我沒有看到,只要重構它作爲產生的,它可以處理它的工具的任何優勢。
該工具(意思是這種情況下的設計者)會在更新代碼後立即「銷燬」所有重構工作。

然而,你應該分割你的控制/窗口/ ...到多個控件 - 然後代碼會自動變短,你將能夠更容易地維護你的UI。

作爲一個結論:不要重構產生的代碼但重構你的控制。

+0

Netbeans拒絕通過顯示編譯器錯誤來處理它 - 代碼太大.... – 2010-01-23 10:31:16

+0

GUI是通過面板設計的...在gui中有很多面板....如何我可以爲每個Panel編寫一個單獨的類並從主JFrame中調用它 – 2010-01-23 10:32:46

+0

Peter Lang所說的:使用JPanels來控制各組控件並將它們拖到「Mainframe」上。 – Matthias 2010-01-23 12:16:34

8

10.000行代碼聽起來像你擁有一個類中的所有東西。

開始通過拆分源成模型,視圖和控制(MVC)。


您也許能夠將一些JPanels提取到不同的類中。一種方法是創建一個新的JPanel(新文件),並將您的組件從一個主面板中剪切/粘貼到新的JPanel中。保存並編譯您的新面板。

然後返回到你的主框架,選擇Beans - >Choose BeanPalette並選擇新創建的類(com.example.YourPanel爲例)。

在嘗試此操作之前,請確保備有您的應用程序。

+0

+1注意:將新的JPanel佈局管理器設置爲與原始面板匹配非常重要,否則粘貼的結果將看起來不像原始的。 – 2010-02-18 19:57:05

1

用layoutmanagers手工編寫GUI代碼。

使用GUI構建工具,幾乎不可能重構GUI代碼。我必須使用這些愚蠢的Intellij Swing GUI設計器表單。我現在甚至不能在Eclipse中重命名我的包,因爲它不會在forms.XML文件中更新。

遠離GUI構建器。如果你想構建真正複雜的,可維護的GUI,那麼通過使用GridBagLayout和其他所有功能來手動完成。

0

如果你必須使用netbeans,由於項目限制(例如團隊的其他部分或需求),然後使用Matisse將巨大的表單分解成更小的面板,每個面板都可由設計人員編輯。你可以通過創建一個新的表單,以及從大表格切割和粘貼面板到新表單。

但在同一時間,確保所有的業務邏輯移出UI類。

如果您不必使用matisse/netbeans,您可以在Eclipse中打開該項目,並使用WindowBuilder編輯窗體,它將以真正的Java代碼而不是不可編輯的形式進行編輯,然後您可以切割並編輯它到你的心臟的內容。

0

您可以將應用程序邏輯提取到單獨的子類中。然後,直接使用子類。我用下面的方法成功了。

  1. 由我們定義的與應用程序邏輯相關的成員移至新創建的子類。
  2. 組件訪問修飾符被設置爲「受保護」(默認爲 ,它們是「私有」)。爲此,請執行以下操作:右鍵單擊 - >屬性 - >代碼(選項卡) - >將 「變量修飾符」設置爲「受保護」
  3. 將事件處理方法移至子類 - 使用屬性窗格它通過添加以下代碼示例中的相關代碼來更改initComponents()函數。這裏定義的btnNum6ActionPerformed()被添加到類爲空的類。不幸的是,btnNum6ActionPerformed()是私有的,無法使用NetBeans IDE更改訪問修飾符。因此,它們不能被覆蓋。爲了擺脫這個,你可以定義另一箇中介函數,並在btnNum6ActionPerformed()中調用它。最好使基類及其中間事件處理函數抽象化。

    btnNum6.addActionListener(new java.awt.event.ActionListener() { 
        public void actionPerformed(java.awt.event.ActionEvent evt) { 
         btnNum6ActionPerformed(evt);//Definition of this method is added too 
        } 
    });