7

Java swing ui アプリケーションで MVP (具体的には Passive-View) パターンに従おうとしています。

アプリケーションの基本設計は、ウィザード コントロールを連想させます。画面は次の 2 つの主要部分に分かれています。

  • アクティブなビュー。
  • ナビゲーション ボタンを備えた静的なナビゲーション バー。

ユーザーはボタンを使用してアクティブ ビューを変更できますが、バーは常に表示されます。

このシナリオをモデル化すると、それぞれが独自のプレゼンター、ビュー インターフェイス、およびビュー実装 (JPanel を使用) を備えた、さまざまなスクリーンがたくさんあります。次に、JFrame を使用して、シェル プレゼンター、ビュー インターフェイス、およびビューの実装を作成します。アイデアは、シェルが最初に読み込まれ、常に表示され、下部のナビゲーション バーが表示され、アクティブなビュー用のスペースが残されるというものです。シェル プレゼンターを使用すると、現在アクティブな画面を次のように設定できます。

interface View {
}

class Presenter {
    View view;

    public Presenter(View view) {
        this.view = view;
    }

    public View getView() {
        return view;
    }

}

interface ShellView extends View {
    void setActiveView(View activeView);
}

class ShellPresenter extends Presenter {
    private ShellView shellView;

    public void setActivePresenter(Presenter activePresenter) { 
        shellView.setActiveView(activePresenter.getView());
    }
}

class ShellFrame implements ShellView {
    private JFrame frame;
    private JPanel activePanel;
    private JPanel navigationBar;

    public ShellFrame() {
        Container c = frame.getContentPane();
        c.add(activePanel);
        c.add(navigationBar);
    }

    public setActiveView(View activeView) {
        ???
    }
}

問題は setActiveView メソッドにあります。 View インターフェイスが一般的で JPanels について何も知らない場合、activeView を activePanel に設定する方法がわかりません。明らかに、プレゼンターに JPanels についても知られたくありません。

4

3 に答える 3

1

ビューの定義を次のように変更できますか?

interface View {
    JComponent getContainer();
}

各ビューがビューの内容を簡単に取得できるようにするには?シェルは、返されるJComponentの実装を知る必要はありません。

于 2010-02-10T23:40:15.333 に答える
1

View インターフェイスは、JPanel で表示可能なものを取得する方法を提供する必要があります。

interface View {
    Component getComponent();
}

次に、ShellFrame で (BorderLayout を使用すると仮定します)、次の方法でビューを設定できます。

public setActiveView(View activeView) {
   activePanel.add(activeView.getComponent(), BorderLayout.CENTER);     
}
于 2010-02-16T21:08:39.097 に答える