1. ホーム
  2. java

[解決済み] MVCパターンとSwing

2023-05-23 03:53:17

質問

私が実際のSwingライフで最も理解するのが難しいデザインパターンの1つが、MVCパターンです。このサイトでは、このパターンについて説明した投稿をかなり見てきましたが、自分の Java Swing アプリケーションでこのパターンを活用する方法について、まだ明確に理解しているとは思えません。

テーブル、いくつかのテキストフィールド、およびいくつかのボタンを含む JFrame があるとします。おそらく、JTableと基礎となるデータモデルを橋渡しするためにTableModelを使用すると思います。しかし、フィールドのクリア、フィールドの検証、フィールドのロック、ボタン操作などの関数は、通常、JFrameの中に直接置かれるでしょう。しかし、それはパターンのコントローラとビューを混在させることになりませんか?

私が見る限り、JTable(とモデル)を見ているときは何とかMVCパターンを正しく実装できているのですが、JFrame全体を見たときに事態が泥沼化しています。

これに関して他の人がどのように行っているのか、本当に聞きたいです。MVC パターンを使用して、ユーザーにテーブル、いくつかのフィールド、およびいくつかのボタンを表示する必要がある場合、どのように対処しますか?

どのように解決するのですか?

MVC in swingでお勧めの本は、Freeman and Freemanの "Head First Design Patterns"でしょう。MVCについて非常に包括的な説明があります。

簡単な概要

  1. あなたはユーザーです--あなたはビューと対話します。 ビューはモデルへのあなたの窓です。あなたがビューに対して何かをするとき(例えば 再生ボタンをクリックするように)、ビューはあなたが何をしたかをコントローラに伝えます。それを処理するのは コントローラはそれを処理するのが仕事です。

  2. コントローラがモデルに状態を変更するように要求します。 コントローラはあなたのアクションを受け取り、それを解釈します。もしあなたが ボタンをクリックしたら、それが何を意味するのか、そしてその行動に基づいてモデルがどのように操作されるべきかを理解するのはコントローラの仕事です。 そのアクションに基づいてモデルをどのように操作すべきかを考えるのがコントローラの仕事です。

  3. コントローラはビューに変更を依頼することもあります。 コントローラがビューからアクションを受け取ったとき、その結果、ビューに変更を指示する必要がある場合があります。 ビューを変更する必要があるかもしれません。例えば、コントローラは を有効にしたり、インターフェイスの特定のボタンやメニュー項目を無効にしたりすることができます。

  4. モデルの状態が変化したときに、モデルがビューに通知します。 モデル内で何かが変更されたとき、あなたが行った何らかのアクション(ボタンをクリックするなど)か、他の内部的な変更(次をクリックするなど)に基づいて (ボタンをクリックするなど) または他の内部的な変化 (プレイリストの次の曲が始まったなど) に基づいて、モデル内で何かが変化したとき、モデルはビューにそのことを通知します。 プレイリストの次の曲が始まったなど)、モデルはビューに その状態が変化したことをビューに通知します。

  5. ビューはモデルに対して状態を問い合わせます。 ビューは表示する状態をモデルから直接取得します。例えば、モデル が新しい曲の再生が始まったことを通知すると、ビューはモデルから曲名を要求し、それを表示します。 はモデルから曲名を要求し、それを表示します。ビューは また、ビューは、コントローラがビューに何らかの変更を要求した結果、モデルに状態を要求することもあります。 がビューに何らかの変更を要求した結果、ビューがモデルに状態を問い合わせることもあります。

ソース (クリーミーコントローラーとは何かと疑問に思う方のために説明すると、オレオクッキーを思い浮かべてください。コントローラーがクリームの中心で、ビューが上のビスケット、モデルが下のビスケットです)

ええと、もし興味があるなら、MVC パターンについてのかなり面白い歌を次のサイトからダウンロードできます。 からダウンロードできます。 !

Swingプログラミングで直面する問題の一つに、SwingWorkerとEventDispatchのスレッドをMVCパターンと融合させることがあります。プログラムによっては、ビューまたはコントローラがSwingWorkerを拡張して doInBackground() メソッドをオーバーライドする必要があるかもしれません。これは、典型的なMVCパターンと簡単に融合でき、Swingアプリケーションの典型的なものです。

EDIT #1 :

さらに、MVCは様々なパターンの複合体であると考えることが重要です。例えば、モデルをObserverパターンで実装し(Viewをモデルのオブザーバーとして登録する必要がある)、コントローラはStrategyパターンを使用することができます。

編集2 :

さらに具体的にお答えしたいと思います。テーブルボタンなどはViewで表示させるべきで、当然ActionListenerを実装しているはずです。あなたの actionPerformed() メソッドで、イベントを検出し、コントローラ内の関連するメソッドに送信します(覚えておいてください-ビューはコントローラへの参照を保持しています)。つまり、ボタンがクリックされると、ビューでイベントが検出され、コントローラのメソッドに送られ、コントローラはビューに直接ボタンを無効化するように要求したりします。次に、コントローラはモデルと対話し、モデルを変更します(モデルには主にゲッターとセッターのメソッドがあり、その他にオブザーバの登録や通知などのメソッドもあります)。モデルが変更されるとすぐに、登録されたオブザーバ(あなたの場合、これはビューになります)の更新を呼び出します。したがって、ビューは自分自身を更新するようになります。