簡體   English   中英

如何構建Swing應用程序

[英]How To Structure a Swing Application

我對搖擺或GUI設計一般沒有多少經驗(大學里的一些WPF應用程序的高度很高),但是我的任務是在工作中重構部分循環遺留應用程序。

我被要求重構的部分圍繞一個彈出窗口,該窗口可以根據特定的值對象以三種不同的格式顯示。 這3種不同的格式都共享一些基本字段,然后有條件地確定其他格式。 負責這個GUI元素的類長約5k,我認為它應該分成三個子類,基類中的共享內容都可以擴展。 但是我絕對不知道這是否是正確的方法。

任何人都可以強調一些用於處理不同擺動組件的策略,這些組件共享按鈕/字段等元素嗎?

此外,是否有任何大型OSS搖擺應用程序可用於學習?

更多信息:我正在處理的應用程序是一個龐大的遺留應用程序,目前相當可怕的結構。 我是團隊的新手(也是一個相當近的畢業生,因此在這個領域沒有太多的經驗)並且被要求嘗試分解一個負責顯示此彈出窗口的巨大課程更小的可維護組件。 實際上,應用程序中有一個彈出窗口允許用戶響應某些事件,這有三種不同的外觀,具體取決於他們需要響應的請求的子類型。 很大一部分GUI元素在所有三種子類型中是一致的,因此我很想知道繼承是否是這里最好的方法還是有其他策略來處理這個?

閱讀評論,我想我可以回答這個問題。 一個真正的答案需要一本書。

  1. 將GUI分解為盡可能多的嵌套JPanel ,以描述GUI。 使用BorderLayout簡單嵌套JPanel比使用GridBagLayout的復雜JPanel更可取。 要清楚,我不批評GridBagLayout 它在創建表單時很有用。 但它不是唯一的Swing布局管理器。

  2. 將每個嵌套的JPanel放入自己的類中。

  3. 使用Swing組件時使用組合。 當且僅當您的類將覆蓋其中一個JComponent方法時才使用繼承。

  4. 每個JPanel都有自己的JButtonJLabel等組件。 JBUtton A是為JPanel A定義的,而JButton B是為JPanel B定義的,即使GUI的用戶認為它們是相同的按鈕。 您可以通過創建包含標簽和按鈕文本的GUI模型來最小化重復。 您必須通過編寫JButton A和JButton B可以執行的公共ActionListener來消除動作代碼的重復(按下按鈕時執行的代碼)。

  5. Swing應用程序必須以調用SwingUtilities.invokelater() 這可確保在Event Dispatch線程(EDT)上定義和使用Swing組件。

  6. 在Swing應用程序中只使用一個 JFrame

  7. 每個JPanel 必須定義一個Swing布局管理器。

  8. 某些組件(如JListJTable在封裝在JScrollPane時效果更好。

我敢肯定我已經忘記了一些事情,但這應該是一個好的開始。

如果您要設置一個創建50%共享代碼的抽象類,然后從中擴展,該怎么辦?

例如:

abstract class BasePopupPanel extends JPanel {

    public void initialize() {
        // Initialize all the shared code here.
        // eg. add(new JButton("TEST");
    }
}

現在您創建實際的彈出面板:

public class GiraffePopupPanel extends BasePopupPanel {

    public void initialize() {
        super.initialize();
        // Here you do all the initializations for this class.
    }
}

您可以根據需要創建盡可能多的這些內容。 什么時候添加它們...

...假設您有一個名為displayPopup的方法,那么簽名將如下所示:

public void displayPopup(BasePopupPanel popup) {
    // do stuff regarding JDialogs, etc.
    // ...
    popup.initialize();
    // do more stuff...
}

我希望能給你一個關於如何重構課程的觀點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM