[解決済み] MVCパターンとSwing
質問
私が実際のSwingライフで最も理解するのが難しいデザインパターンの1つが、MVCパターンです。このサイトでは、このパターンについて説明した投稿をかなり見てきましたが、自分の Java Swing アプリケーションでこのパターンを活用する方法について、まだ明確に理解しているとは思えません。
テーブル、いくつかのテキストフィールド、およびいくつかのボタンを含む JFrame があるとします。おそらく、JTableと基礎となるデータモデルを橋渡しするためにTableModelを使用すると思います。しかし、フィールドのクリア、フィールドの検証、フィールドのロック、ボタン操作などの関数は、通常、JFrameの中に直接置かれるでしょう。しかし、それはパターンのコントローラとビューを混在させることになりませんか?
私が見る限り、JTable(とモデル)を見ているときは何とかMVCパターンを正しく実装できているのですが、JFrame全体を見たときに事態が泥沼化しています。
これに関して他の人がどのように行っているのか、本当に聞きたいです。MVC パターンを使用して、ユーザーにテーブル、いくつかのフィールド、およびいくつかのボタンを表示する必要がある場合、どのように対処しますか?
どのように解決するのですか?
MVC in swingでお勧めの本は、Freeman and Freemanの "Head First Design Patterns"でしょう。MVCについて非常に包括的な説明があります。
簡単な概要
あなたはユーザーです--あなたはビューと対話します。 ビューはモデルへのあなたの窓です。あなたがビューに対して何かをするとき(例えば 再生ボタンをクリックするように)、ビューはあなたが何をしたかをコントローラに伝えます。それを処理するのは コントローラはそれを処理するのが仕事です。
コントローラがモデルに状態を変更するように要求します。 コントローラはあなたのアクションを受け取り、それを解釈します。もしあなたが ボタンをクリックしたら、それが何を意味するのか、そしてその行動に基づいてモデルがどのように操作されるべきかを理解するのはコントローラの仕事です。 そのアクションに基づいてモデルをどのように操作すべきかを考えるのがコントローラの仕事です。
コントローラはビューに変更を依頼することもあります。 コントローラがビューからアクションを受け取ったとき、その結果、ビューに変更を指示する必要がある場合があります。 ビューを変更する必要があるかもしれません。例えば、コントローラは を有効にしたり、インターフェイスの特定のボタンやメニュー項目を無効にしたりすることができます。
モデルの状態が変化したときに、モデルがビューに通知します。 モデル内で何かが変更されたとき、あなたが行った何らかのアクション(ボタンをクリックするなど)か、他の内部的な変更(次をクリックするなど)に基づいて (ボタンをクリックするなど) または他の内部的な変化 (プレイリストの次の曲が始まったなど) に基づいて、モデル内で何かが変化したとき、モデルはビューにそのことを通知します。 プレイリストの次の曲が始まったなど)、モデルはビューに その状態が変化したことをビューに通知します。
ビューはモデルに対して状態を問い合わせます。 ビューは表示する状態をモデルから直接取得します。例えば、モデル が新しい曲の再生が始まったことを通知すると、ビューはモデルから曲名を要求し、それを表示します。 はモデルから曲名を要求し、それを表示します。ビューは また、ビューは、コントローラがビューに何らかの変更を要求した結果、モデルに状態を要求することもあります。 がビューに何らかの変更を要求した結果、ビューがモデルに状態を問い合わせることもあります。
ソース (クリーミーコントローラーとは何かと疑問に思う方のために説明すると、オレオクッキーを思い浮かべてください。コントローラーがクリームの中心で、ビューが上のビスケット、モデルが下のビスケットです)
ええと、もし興味があるなら、MVC パターンについてのかなり面白い歌を次のサイトからダウンロードできます。 からダウンロードできます。 !
Swingプログラミングで直面する問題の一つに、SwingWorkerとEventDispatchのスレッドをMVCパターンと融合させることがあります。プログラムによっては、ビューまたはコントローラがSwingWorkerを拡張して
doInBackground()
メソッドをオーバーライドする必要があるかもしれません。これは、典型的なMVCパターンと簡単に融合でき、Swingアプリケーションの典型的なものです。
EDIT #1 :
さらに、MVCは様々なパターンの複合体であると考えることが重要です。例えば、モデルをObserverパターンで実装し(Viewをモデルのオブザーバーとして登録する必要がある)、コントローラはStrategyパターンを使用することができます。
編集2 :
さらに具体的にお答えしたいと思います。テーブルボタンなどはViewで表示させるべきで、当然ActionListenerを実装しているはずです。あなたの
actionPerformed()
メソッドで、イベントを検出し、コントローラ内の関連するメソッドに送信します(覚えておいてください-ビューはコントローラへの参照を保持しています)。つまり、ボタンがクリックされると、ビューでイベントが検出され、コントローラのメソッドに送られ、コントローラはビューに直接ボタンを無効化するように要求したりします。次に、コントローラはモデルと対話し、モデルを変更します(モデルには主にゲッターとセッターのメソッドがあり、その他にオブザーバの登録や通知などのメソッドもあります)。モデルが変更されるとすぐに、登録されたオブザーバ(あなたの場合、これはビューになります)の更新を呼び出します。したがって、ビューは自分自身を更新するようになります。
関連
-
java send https request prompt java.security.cert.について。
-
Server Tomcat v9.0 Server at localhost の起動に失敗しました。
-
Zipファイルの圧縮・解凍にantを使用する
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] MVPとMVC、その違いは何ですか?
-
[解決済み] AndroidにおけるMVCパターン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NullPointerException - java.lang.
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
Javaジェネリックを1つの記事で
-
keytool error: java.io.FileNotFoundException: cacerts (アクセス拒否されました。)
-
配列定数は初期化子でのみ使用可能です。
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
eclipse にリソースリーク:'in' が閉じない
-
Server Tomcat v9.0 Server at localhost の起動に失敗しました。
-
java 365*1000*60*60*24 計算問題