【发布时间】:2013-01-20 22:23:23
【问题描述】:
我的项目是基于 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?
}
}
【问题讨论】:
-
看来这可能类似于这个问题:stackoverflow.com/questions/12759619/… 答案似乎是让模型通知 SwingWorker,后者又通知视图。不过,我仍在寻找建议......
标签: java multithreading swing swingworker