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 つのビューしかないはずですか? たぶん、すべてのモデル/ビュー/コントローラーを取り、適切にインスタンス化する「関係」クラスが必要ですか?
私は完全に途方に暮れているので、どんなアドバイスも大歓迎です!