2009-07-16 5 views
7

私はSwingアプリケーションの構造化にMVCを使いたいが、矛盾があるようだ。建築用MVCとスイング

私がMVCを理解しているので、コントローラは入力を処理してモデルを更新する必要があります。モデルは、ビューがどれであるかをオブザーバに通知する必要があります。

私は、Swingがビューのすべて一部である二つの問題

  • を持っています。コンポーネントに独自のモデルがあるという事実は実装の詳細です。スイング固有のコードをコントローラー/モデルから外しておきたいのですが?
  • 私のコントローラはユーザによってトリガされたイベントを受信する必要がありますが、これらはビュー内にあるスイングコンポーネントから来ており、コントローラはそのビューについて知るべきではありません。

これまで何度もこの問題が解決されていますが、まともなサイズのMVCベースのスイングアプリの実際の例は見つかりません。

アップデート - 私はMVCは、直接に応じるいない何

を忘れてしまった問題は、アプリケーションの階層内のさまざまなMVCコンポーネントの構造です。たとえば、メインディスプレイには「販売」タブと「購入」タブがあり、それぞれには「新しい」パネルと「クエリ」パネルがあります。その上に、要求に応じて(場合によっては複数の)ウィンドウを作成する「選択されたものを修正する」ボタンがあるかもしれない。

何かが要求に応じて、これらのサブコンポーネントのモデル、ビュー、コントローラを作成する必要があります。コントローラやモデルは、どのビューを作成するのか分からず、アプリケーションロジックであり、イベント(コントローラのジョブ)に応答しているのでビューではい​​けないので、コントローラであることはできません。

回答がありますか?

答えて

6

JButtonなどのスイングコンポーネントはコントローラです。ビュークラスはJButtonUIなど

"view"コードからイベント処理ロジックを分離する場合、最も簡単なことは、すべてのパネルに特定のControllerクラスを注入することです。

doStuffButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     controller.doStuff(); // logic in controller 
    } 
}); 

あなたのパネルのクラスは例えばので、お使いのコントローラにModel Sを提供することができます:、イベント処理は同じように見えることができますこの方法

public void doStuff() { 
    MyData data = ... 
    dataModel.setData(data) 
} 

コントローラはモデルを認識しているそのように、ビューはコントローラを認識していますが、コントローラはビ​​ュー(実装)を認識しません

+0

a)スイングに関する限り、つまりコンポーネントレベルです。私は自分のアプリケーションにMVCアーキテクチャを使用することを話しています。 b)実際にスイングは厳密にはMVCではなく、コンポーネントはコントローラとビューであり、UIDelegateを使用します。 – Draemon

+0

これは本当ですが、a)に関する限り、私は混乱しています。 –

+0

JButtonクラスに描画ロジックのすべてが含まれていないことを意味しています(私はビューと見なされます) –

0

JavaスイングでコントローラはUIコンポーネントを知る必要はありません。コントローラコードはActionListenerに実装します。次に、ActionListenerは、例えば、 JButtonJButtonがクリックされると、ActionListenerが呼び出されます。 ActionListenerは他のモデルにのみ依存します。それは入力としていくつかのモデルを使用し、結果や出力として他のモデルを使用します。メソッドの引数や戻り値に似ています。モデルは更新されたときにUIに通知します。したがって、コントローラロジックがuiコンポーネントを知る必要はありません。たとえモデルオブジェクトであっても、通知はオブザーバパターンによって行われていることを知らない。したがって、モデルオブジェクトは、モデルが変更された場合に通知を受けたい人がいることを知るだけです。

は、これは私がJavaのスイングでMVCパターンをinterprete方法ですhttps://www.link-intersystems.com/bin/view/Blog/The+MVC+pattern+implemented+with+java+swing

から取った次の例を見てみましょう。 Javaのスイングにおいて

  • 赤=モデル
  • グリーン=ビュー
  • ブルー=コントローラ

enter image description here

ならびにモデルおよびコントローラを実装するいくつかのコンポーネントがあります。例えば。 javax.swing.Action UIモデル(プロパティ:有効化、小さなアイコン、名前など)を実装し、コントローラがActionListenerに拡張されているため、コントローラです。

関連する問題