我的项目建立在 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?
}
}