8

私は実際のところ、Swing や GUI 設計全般に関する経験はあまりありません (大学のいくつかの WPF アプリケーションは、その高さについてです) が、職場で Swing レガシー アプリケーションの一部をリファクタリングする任務を負っています。

リファクタリングを依頼された部分は、特定の値オブジェクトに応じて 3 つの異なる形式で表示できるポップアップ ウィンドウを中心に展開しています。これら 3 つの異なる形式はすべて、いくつかの基本フィールドを共有し、条件付きで決定される追加のフィールドを持ちます。この GUI 要素を担当するクラスの長さは ~5k であり、3 つのサブクラスに分割する必要があると考えていました。基本クラスの共有要素はすべて拡張されています。ただし、これが正しいアプローチであるかどうかはまったくわかりません。

ボタン/フィールドなどの要素を共有するさまざまなスイングコンポーネントを扱う際に使用される戦略を強調できる人はいますか?

さらに、学習に使用できる大規模な OSS スウィング アプリケーションはありますか?

詳細: 私が取り組んでいるアプリケーションは大規模なレガシー アプリケーションであり、現時点では非常に恐ろしい構造になっています。私はチームに参加したばかりで (かなり最近卒業したので、この分野での経験はあまりありません)、現時点でこのポップアップの表示を担当する巨大なクラスの 1 つを分析するように依頼されました。より保守しやすい小さなコンポーネントに。基本的に、ユーザーが特定のイベントに応答できるようにするポップアップがアプリケーションにあり、応答する必要がある要求のサブタイプに応じて、3 つの異なる外観があります。GUI要素の大部分は、3つのサブタイプすべてで一貫しています。そのため、継承がここで最善のアプローチになるかどうか、またはこれに対処するための他の戦略があるかどうかを知りたいです?

4

2 に答える 2

19

コメントを読んで、この質問に答えることができると思います。本当の答えには本が必要です。

  1. GUI を記述するのに必要な数のネストされた に GUI を分割しJPanelます。JPanelを使用する単純な入れ子は、を使用BorderLayoutする複雑なものよりも望ましいです。明確にするために、私は を批判しているわけではありません。フォームを作成するときに便利です。しかし、Swing レイアウト マネージャーはこれだけではありません。JPanelGridBagLayoutGridBagLayout

  2. ネストされたそれぞれJPanelを独自のクラスに入れます。

  3. Swing コンポーネントを使用する場合はコンポジションを使用します。JComponentクラスがいずれかのメソッドをオーバーライドする場合にのみ、継承を使用してください。

  4. それぞれJPanelに独自JButtonJLabel、 などのコンポーネントがあります。 GUI のユーザーが同じボタンだと思っていても、JBUttonA はJPanelA に対して定義され、JButtonB は B に対して定義されます。JPanelラベルとボタンのテキストを含む GUI モデルを作成することで、重複を最小限に抑えることができます。A とB が実行できる共通ActionListenerの s を記述して、アクション コード (ボタンが押されたときに実行されるコード) の重複を排除する必要があります。JButtonJButton

  5. Swing アプリケーションは、への呼び出しで開始する必要SwingUtilities.invokelater()があります。これにより、Swing コンポーネントが定義され、イベント ディスパッチ スレッド (EDT) で使用されることが保証されます。

  6. Swing アプリケーションで使用されるのは1 つ だけです。JFrame

  7. 各 JPanelには、Swing レイアウト マネージャーが定義されている必要があります。

  8. JListやなどの特定のコンポーネントは、 でJTable囲むとより適切に機能しJScrollPaneます。

いくつかのことを忘れていると思いますが、これは良いスタートになるはずです。

于 2013-01-28T17:43:18.180 に答える
2

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...
}

これにより、クラスをリファクタリングする方法について1つのビューが得られることを願っています。

于 2013-01-28T17:53:15.663 に答える