0

Observer/Observable を使用した MVC 設計パラダイムを使用して、「Person データベース」Java Swing アプリケーションを開発しようとしています。以下は、私が使用している M/V/C の要約です。

App
    AppModel
        (Empty right now, possibly i'll store certain static application info such as version number here)
    AppView
        (Creates a JFrame and a few other Swing components)
    AppController
        (Instantiates AppModel, AppView and also a PersonController and a PersonListController)

Person

    PersonModel
        (Stores info for 1 person)

    PersonView
        (Displays a number of form fields inside a JPanel (i.e Name, Age, Phone number). Observes PersonModel.)

    PersonController
        (Instantiates PersonView. Observes PersonView. Instantiates PersonModel. Updates PersonModel.)

PersonList

    PersonListModel
        (Stores a list of Persons)

    PersonListView
        (Displays a list of persons with appropriate Add / Delete buttons. Observes PersonList.)

    PersonListController
        (Instantiates PersonListView. Observes PersonListView. Instantiates PersonListModel. Updates PersonListModel)

また、アプリが起動する「ブートストラップ」。新しい AppController を作成します。

実際のアプリケーションでは、より多くの (そして異なる) モデル/ビュー/コントローラー オブジェクトが存在しますが、この例は単純にしたいと考えています。

これらの個別のビューを 1 つの UI に「マージ」しながら、懸念事項を適切に分離する方法がわかりません。

たとえば、PersonListView を考えてみましょう。私見では、AppView(JFrameなど)を気にする必要はありません。PersonListView は、独自のモデルを見て、それに応じて自分自身を更新するだけです。ただし、PersonListView 自体の Swing コンポーネントを別のビューである AppView の Swing コンポーネントに追加する必要があるため、これを強制することはできません。

そのため、現時点では、AppController は独自の View をインスタンス化し、加えて間接的に PersonView と PersonListView を (コントローラーのインスタンス化を介して) 作成しています。次に AppController は、各ビューの「メイン」の Jpanel を取得し、AppView に追加する必要がある「親」の Swing コンポーネントを取得して追加します。

これは私には正しい方法ではないようです。Swing関係のメンバーを隠れ家から引っ張り出したり、コントローラーの中でいじったりしています。実際、コントローラー内でモデルとビューをインスタンス化することも悪いようですが、より良い方法がわかりません。

私は最近、血まみれのことを夢見ている「単純なMVC」チュートリアルを十分に見てきましたが、特にSwingに関する場合、複数のモデル、ビュー、コントローラーの関係に入るチュートリアルは1つもありません。たぶん私は間違っていて、アプリには 1 つのビューしかないはずですか? たぶん、すべてのモデル/ビュー/コントローラーを取り、適切にインスタンス化する「関係」クラスが必要ですか?

私は完全に途方に暮れているので、どんなアドバイスも大歓迎です!

4

1 に答える 1

1

これは、厳密な MVC パラダイムが崩壊する場所です (とにかく Swing では、Swing がそのように書かれている理由を説明するかもしれません)。

Swing はビュー要素とコントロール要素を組み合わせて、モデルを分離したままにします。つまり、ビューを他のビューに自由に追加でき、コントロールが追従します (モデルは動的なままです)。

MVC に対して厳密なアプローチを使用することを主張する開発者がいますが、優先順位をまだ教えてくれません。つまり、コントロールがビューについて認識している必要があるか、またはビューがコントロールについて認識している必要があります-どちらが他方にプラグインするか。個人的には怠け者で、Swing の実装に従うだけです。

私の考えでは、厳密な MVC に従いたい場合は、基本的に、ビュー全体へのアクセスを許可するコントローラーのパブリック メソッドを許可します (たとえば、JPanelビューを構成するすべてのコンポーネントを含むとします)。

たとえば、JComboBoxまたはについて考えてみてください。JSpinnerどちらもビューを構成する多くのコンポーネント (エディター、ボタンなど) を持っていますが、アクセス ポイントは 1 つだけで、コンポーネント自体は...

次の問題は、さまざまなビューを 1 つの全体ビューに結合する方法です。

個人的には、「マスター」コントローラーは、必要に応じて、これらの他のコントローラーについて何らかの方法で知る必要があるため、さまざまな既知のコントローラーを一緒に提供できる何らかの種類のグループコントローラーを作成します (setPersonListたとえば)。それらをレイアウトする方法を知るために。

私見では

于 2013-05-07T19:50:29.597 に答える