4

Java、Swing、MVC、および SwingWorker についてよく読んでいますが、MVC でのモデルの役割については完全に混乱しています。

私は2つのボタンを持つアプリを構築しています:

  1. ファイルを選ぶ
  2. ファイルを読む

ロギングに使用されるテキストボックスもあります。

私が現在していること:

  1. ビューにはウィジェットが含まれていますが、ロジックは含まれていません
  2. ボタンの actionPerformed() メソッドは、コントローラのメソッドを呼び出します
  3. コントローラーは、ファイルを取得するために必要なデータ (OptionPane.showOpenDialog() の表示を含む) をフェッチします。
  4. ファイル参照はモデルに保存されます。
  5. モデルは、新しいファイルのビューに (PropertyChangeSupport、オブザーバー パターン) を通知します。
  6. ビューは「ファイルの読み取り」ボタンを有効にします

私の最初の質問:モデルに状態を保存する必要がありますか? つまり、一連の操作に関連する情報です。ファイルを読み取る前に、まずファイルを選択する必要があります。したがって、私のモデルはステートマシンになります。

2 番目の質問: Controller に OptionPane を表示させるのは正しいですか?

それから楽しみが始まります。ユーザーは「ファイルの読み取り」ボタンをクリックします。「ファイルの選択」ボタンとほぼ同じことをしています。View は Controller を呼び出しますが、Controller は SwingWorker を使用してファイルを読み取ります。これは EDT で行うべきではないためです。SwingWorker は、View (SwingWorker.process() メソッド) への参照を介してテキスト ボックスに追加される中間ログ メッセージを発行します。コントローラは、SwingWorker からの「状態」プロパティの変更をリッスンします。「状態」が「DONE」の場合、コントローラーは「get()」関数を呼び出します。すべてが OK であれば、結果がモデルに設定されます。そうでない場合は、例外が処理されます。

私の 3 番目の最も重要な質問: モデルはファイルの読み取りを行うべきではありませんか?! MVC の全体的なポイントは、すべての利点 (テスト容易性など) を備えた関心の分離です。新しいビュー (例: CLI) が必要な場合はどうすればよいですか? 次に、私のモデルはデータモデルのみになります。ファイルの読み取り方法についての手がかりがありません。スレッドの問題はどうですか?

うまくいけば、私に良いアドバイスを与えることができます。インターネット上には SwingWorker や MVC などに関する例がたくさんあります。しかし、私の問題はそれらに対してどのようにコーディングするかではなく、どのように設計するかです。

4

1 に答える 1

7

あなたはかなり順調に進んでいると思います。質問に 1 つずつ答えるには:

1.モデルに状態を保存する必要がありますか? はい、モデルに状態を保存できますし、保存する必要があります。モデルは、状態とその状態を変更する動作です。

2. Controller に OptionPane を表示させるのは正しいですか? はい - アプリケーションの設計 (ロジック フロー) がファイルの取得元を決定します。モデルは、ファイル名を取得するだけで、読み取るファイル名を取得する方法を気にしません。フローはコントローラーのドメインです。

3. モデルはファイルの読み取りを行うべきではありませんか? はい、ファイルの読み取りはモデルの一部です。コントローラーが swing ワーカーを呼び出している場合でも、swing ワーカーは概念的にはモデルの一部であり、少なくとも、swing ワーカーによって実行される主要なロジックです。理想的には、ファイルをロードするためのすべてのロジックがモデル クラスに存在します。次に、コントローラーは、swing ワーカーを使用してこれが呼び出されるように手配できます。コントローラーは、ファイルの読み込みがバックグラウンド スレッドで行われることを決定し、バックグラウンドからファイルを読み込むようにモデルに指示します。コントローラーの swing ワーカーは、モデルから読み込み進行状況イベントを受け取り、publish() を呼び出してこれらを処理し、次に process() が UI を更新します。

原則として、モデルを変更する必要なく、アプリ全体をコンソール アプリとして書き直すことができるはずです。当然、ビューは変わりますが、それは、Swing ではなく stdout を使用してモデルを提示する必要があるためです。最大の変更点はコントローラーで発生します。アプリケーション フローが異なります (ファイルの選択はプログラムの引数から行われます)。コントローラーはボタンのクリックをリッスンしてフローを指示しなくなりますが、フローが固定されているか、stdin を介してユーザーと対話します。また、コントローラーのスレッド モデルは異なります。EDT を気にする必要がないため、swing ワーカーは必要ありません。

ご覧のとおり、モデルは状態とその状態への変更を処理し、ビューは状態の提示を処理し、コントローラーは他のすべて、特にモデルをビューに接続します。

于 2011-04-07T21:35:27.693 に答える