2013-03-28 9 views
5

私は開発しようとしているアプリケーションのアーキテクチャを設計する際にいくつかの問題を抱えています。私はJAVAに取り組んでいます。私はJAVA、アーキテクチャ、パターンに関する私の知識を深めたいので、このアプリケーションに取り掛かりました。私は、そうしなければならないように、再利用可能で低結合のアプリケーションを作るためのガイドラインに従っていきたいと思います。アプリケーションには1つのJFrameしかありませんが、内部には複数のJPanelがあり、それぞれがアプリケーションのモジュールを表します。JAVA Swing MVC - メインコントローラー?

質問:JAVA Swingでは、適切なMVCパターンを実装する方法は? 私はそのやり方を理解する方法に苦労しています。

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

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

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

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

希望私は自分自身を明確にしました(そして、私の説明が私の絵よりもいいと思っています:))。

EDIT: アプリケーション利用のサンプル:アプリケーションのすべてのライフサイクル全体

  • 一つ(一つのみ)のJFrame。
  • メニューはBorderLayout.WESTのように左側にあります。
  • アプリケーションの現在のモジュールは、BorderLayout.CENTERのように中央になります。
  • ユーザーがメニューの1つのボタンを押すと、対応するモジュールがBorderLayout.CENTERにロードされます。

メニュー(表示)に独自のコントローラがあり、このコントローラがJFrameと通信する必要がありますか?そして、JFrameは新しいモジュールをLayoutにロードしますか?または、JFrameに独自のコントローラ(またはモデル、Gilbert Le Blancが述べたように)が必要ですか?

私はこれが特定の、または分かりやすいと思われるかもしれないが、私はデスクトップアプリケーションを考えるたびに、私はこれを理解するのに苦労している。

答えて

4

GUIを持つアプリケーションを使用すると、GUIモデルがアプリケーションビューになります。アプリケーションは、GUIモデルを介してGUIと対話します。

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

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

私はGUIコントローラクラスを、データアクセスオブジェクトのような他のアプリケーションコントローラクラスとは別のパッケージに保ちます。

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

この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コンポーネントを拡張する唯一の時間は、コンポーネントメソッドをオーバーライドする場合です。

+0

ありがとうございました。私がゴミ箱への答えに述べたように、私は自分の問題をより具体的に説明するために質問を更新しました。しかし、あなたの答えはすでに私にもう少し研究をさせてくれました。私は、この問題を素早く分類すると思います。リンクありがとうございます! –

+0

あなたの編集した質問を読んだ。 GUIコントローラはGUIモデルとは別のものです。GUIモデルには、GUIを構成するすべてのデータ要素が含まれています。 JTextFieldsの文字列、JTablesのDefaultTableModelsです。 –

+0

@ GilbertLeBlancの例は、SwingアプリケーションがSwingコンポーネントで暗黙のMVCパターンをどのように活用できるかを示しています。 'JTabbedPane'は私が提案した' CardLayout'の良い代替手段です。 – trashgod

2

hereで説明したように、Swingコンポーネントは、observer patternを使用してモデルとビューを緩く結合したseparable model architectureを使用します。すべてのGUIコントロールがアプリケーションのコントローラの一部である必要はありません。 ActionのようなActionListenerを使用すると、アプリケーション機能をカプセル化するのに特に便利です。

補足:CardLayouthere)を使用してパネルを切り替えるとします。 Actionハンドラをボタン、メニュー、コンボ、ツールバーなどでどのように使用できるかに注意してください。各カードのコンテンツには、他のものとは別のMVCパターンを独自に実装することができます。コンポーネント間の通信にはhereと表示されているPropertyChangeEventを使用します。

一般に、Swingコンポーネント、ボタンとテーブルは既にそれぞれのモデルを聴いて、アプリケーションのデータモデルとリスニングビューに集中しています。好都合なことに、Swingモデル。 ComboBoxModelまたはTableモデル 'は、複数のリスナを持つことができます。

+0

ありがとうございました。私はもう少し具体化するために質問を更新しましたが、あなたが提供したすべてのリンクを読むでしょう。ありがとうございました。 –

+0

私は上記で詳しく述べました。 – trashgod