更新をコントローラーに送り返す必要がある長時間実行プロセスで SwingWorker を使用する場合、モデルからビューを分離するにはどうすればよいですか?
を使用して、たとえばそこから
SwingWorkers
doInBackground()
呼び出すことで、EDT の応答性を維持できます。model.doLongProcess()
私が抱えている問題は、プロセスが終了する前にデータを取得して、進行状況でビューを更新しようとすることです..
メソッドを使用してデータを取得できることはわかっていますが、これにより、内にメソッド
SwingWorkers
publish()
のコードを記述する必要があると思います。doLongProcess()
doInBackground()
参考までに、MVC の実装は次のようになります。
http://www.leepoint.net/notes-java/GUI/structure/40mvc.html
/ structure/calc-mvc/CalcMVC.java -- Calculator in MVC pattern.
// Fred Swartz -- December 2004
import javax.swing.*;
public class CalcMVC {
//... Create model, view, and controller. They are
// created once here and passed to the parts that
// need them so there is only one copy of each.
public static void main(String[] args) {
CalcModel model = new CalcModel();
CalcView view = new CalcView(model);
CalcController controller = new CalcController(model, view);
view.setVisible(true);
}
}
他の多くのクラスを一緒にラップして、コントローラー用の単純なインターフェイスを形成する 1 つのモデル クラスがあります。
これらのクラスのコードのすべて/一部/いずれかをコントローラーに移動する必要はありません-そこに属していません。
アップデート:
これが私が取っているアプローチです-それは最もクリーンなソリューションではなくPropertyChangeSupport
、セマンティックレベルで..の乱用として認識される可能性があります。
基本的に、長時間実行されるメソッドを持つすべての低レベル クラスにはpropertyChangeSupport
フィールドがあります。長時間実行されるメソッドはfirePropertyChange()
、メソッドのステータスを更新するために定期的に を呼び出しますが、必ずしもプロパティの変更を報告するわけではありません。
次に、低レベル クラスをラップする Model クラスがこれらのイベントをキャッチし、独自の高レベルfirePropertyChange
.. をcontroller
リッスンできます..
編集:
明確にするために、firePropertyChange(propertyName, oldValue, newValue); を呼び出すと、
- propertyName ---> propertyName を乱用してトピック名を表す
- oldValue =ヌル
- newValue = ブロードキャストしたいメッセージ
次に、モデル内の PropertyChangeListener またはトピック名に基づいてメッセージを識別できる場所。
したがって、Iv は基本的にシステムを曲げて、パブリッシュ/サブスクライブのように使用します ....
上記のメソッドの代わりに、更新される低レベルのクラスに進行状況フィールドを追加し、それに基づいて firePropertyChange を追加できると思います..これは、本来の使用方法と一致します。