5

開発しようとしているアプリケーションのアーキテクチャの設計で問題が発生しています。私はJAVAに取り組んでおり、JAVA、アーキテクチャ、およびパターンに関する全体的な知識を深めたいため、このアプリケーションに取り組み始めました。ガイドラインに従って、再利用可能な低結合アプリケーションを作成したいと考えています。このアプリケーションには JFrame が 1 つしかありませんが、その中に複数の JPanel があり、それぞれがアプリケーションのモジュールを表しています。

問題は、JAVA Swing で適切な MVC パターンを実装する方法です。私はそれが行われるべき方法を理解する方法に苦労しています。

他のすべてのコントローラへの参照を保持するメインのコントローラ クラスが必要ですか? (これを示すための画像があります: https://docs.google.com/file/d/0B7tBdn5slIFeY2FoSmxESTREQ1k/edit?usp=sharing )

この場合、提示されているモジュールの変更を必要とするすべてのイベントは、メインのコントローラーにリダイレクトする必要がありますか?

それとも、JFrame をアプリケーションのコントローラーと結合して、それらと直接通信する必要がありますか?

基本的に、他のすべてを「管理」するクラスが必要かどうかを知りたいです。私はすでにいくつかの説明と異なる意見を読みましたが、これはもう少し具体的だと思います.

私が自分自身を明確にしたことを願っています(そして、私の説明が私の絵よりも優れていることも願っています:))。

編集: アプリケーションの使用例:

  • アプリケーションのライフサイクル全体で 1 つの (唯一の) JFrame。
  • メニューは BorderLayout.WEST のように左側に表示されます。
  • アプリケーションの現在のモジュールは、BorderLayout.CENTER のように中央に配置されます。
  • ユーザーがメニューの 1 つのボタンを押すと、対応するモジュールが BorderLayout.CENTER にロードされます。

メニュー (ビュー) には独自のコントローラーが必要で、このコントローラーは JFrame と通信しますか? そして、JFrameは新しいモジュールをそのレイアウトにロードしますか? それとも、JFrame には独自のコントローラー (または Gilbert Le Blanc が言ったようにモデル) が必要ですか?

これは具体的で理解しやすいように思えるかもしれませんが、デスクトップ アプリケーションについて考えるたびに、これを理解するのに苦労します。

4

2 に答える 2

4

GUI を備えたアプリケーションがある場合、GUI モデルはアプリケーション ビューになります。アプリケーションは、GUI モデルを介して GUI と対話します。

それとも、JFrame をアプリケーションのコントローラーと結合して、それらと直接通信する必要がありますか?

これは私がやったことです。コントローラー クラスをまとめてパッケージ化しましたが、メイン コントローラー クラスを 1 つも作成したことはありません。

GUI コントローラー クラスは、データ アクセス オブジェクトなどの他のアプリケーション コントローラー クラスとは別のパッケージに入れています。

私は通常、各 JPanel を独自のクラスに配置しますが、それは必須ではありません。JFrame には独自のクラスがありますが、JFrame のインスタンスと GUI モデルのインスタンスはほとんどすべての GUI コンポーネントに渡されます。これにより、メニュー操作が可能になります。

このTraffic Signal GUIの記事では、非常に単純な GUI のコーディング方法の基本について説明します。

質問の変更に対応するために編集されました。

GUI コントローラーは GUI モデルとは別のものです。GUI モデルには、GUI を構成するすべてのデータ要素が含まれています。JTextFields の文字列、JTables の DefaultTableModels。

アプリケーションの設計に基づいて、アプリケーションの中心に置きたい JPanel ごとに Java クラスを作成することをお勧めします。JFrame は、メニューに基づいてどの JPanel を表示するかを制御します。また、作業するパネルを選択するタスクを実行するために別のユーザー インターフェイスを使用するJTabbedPaneを確認することもお勧めします。

左側のメニューを使用すると仮定すると、各メニュー オプション (JButton の切り替え) には、独自のコントローラー メソッドまたはクラスがあります。これらのコントローラーは、JFrame のインスタンスを持っている必要があります。これにより、コントローラーは、適切なパネルをディスプレイの中央に配置する JFrame クラスのメソッドを呼び出すことができます。コントローラーは呼び出すメソッドを決定しますが、メソッド自体は JFrame クラスの一部です。

JFrame および JPanel クラスについて話してきました。これらのクラスを構築するには、継承ではなく構成を使用することが重要です。JFrame クラスには JFrame が含まれています。JFrame を拡張しません。Swing コンポーネントを拡張するのは、コンポーネント メソッドをオーバーライドする場合だけです。

于 2013-03-28T22:45:50.320 に答える
2

ここで説明したように、Swing コンポーネントは分離可能なモデル アーキテクチャを使用し、モデルとビューはオブザーバー パターンを使用して疎結合されています。すべての GUI コントロールがアプリケーションのコントローラーの一部である必要はありません。ActionListenerなどの を使用すると、Actionアプリケーションの機能をカプセル化する場合に特に便利です。

補遺:ここCardLayoutに示されている を使用して、パネルを切り替えます。ボタン、メニュー、コンボ、ツールバーなどでハンドラーを使用する方法に注意してください。各カードのコンテンツには、他とは別に、MVC パターンの独自の実装を含めることができます。コンポーネント間の通信には、ここに表示れているを使用します。ActionPropertyChangeEvent

一般に、ボタンやテーブルなどの Swing コンポーネントは、すでにそれぞれのモデルをリッスンしているため、ユーザーはアプリケーションのデータ モデルとそのリッスン ビューに集中する必要があります。ComboBoxModel便利なことに、Model`などの Swing モデルは、Table複数のリスナーを持つことができます。

于 2013-03-29T02:48:38.950 に答える