私のプロジェクトは、JavaのSwingライブラリに基づいて構築されています。GUIを表示するEDTを生成します(正しく機能します)。
EDTを初期化するプログラムへの入り口:
public final class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Start());
}
class Start implements Runnable {
private Model model = new Model();
private Controller controller = new Controller(model);
private View view = new View(controller);
@Override
public void run() {
// Initialize the view and display its JFrame...
}
}
}
}
ただし、GUI内でボタン/ラジオボックスなどをクリックすると、Controllerクラスがモデルに対してアクションを実行する必要があります。
私の質問は次のとおりです。
- コントローラのコードを新しいSwingWorkerでラップする必要がありますか?
- いいえの場合、モデルのコードを新しいSwingWorkerでラップする必要がありますか?
- コントローラのコードをスレッドでラップする場合、モデル内の共有状態変数を同期する必要がありますか?
- 新しいスレッドで実行されているモデルがGUIに変更を通知した場合、これはEDTまたは新しいスレッドで発生しますか?
例えば:
public class Controller {
public void updateModel() {
new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
model.somethingSomethingSomething();
}
}.execute();
}
}
public class Model {
public void somethingSomethingSomething() {
notifyListeners(); // This is going to notify whichever GUI
// is listening to the model.
// Does it have to be wrapped with Swing.invokeLater?
}
}
public class View {
// This function is called when the model notifies its listeners.
public void modelChangedNotifier() {
button.setText("THE MODEL HAS CHANGED"); // Does this occur on the EDT?
}
}