所以,我有一个使用Swing构建GUI并实现MVC设计模式的Java应用程序,因此我最终在视图中使用了很多SwingWorker
实例调用控制器和从控制器到视图的大量EventQueue.invokeLater()
调用。由于Swing和MVC最佳实践的单线程特性,这似乎是要走的路,但现在我的代码重复了以下模式很多次:
public class MainController{
private final View someView;
public void someMethod(Object data){
// Do stuff with the data; maybe change the model.
EventQueue.invokeLater( new Runnable(){
@Override
public void run() {
someView.updateView(Object someObject); //This is the code that I actually need to execute
}
});
}
}
public class View extends JPanel{ // or whatever
private final MainController controller;
public class someListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
new SwingWorker<Void,Void>(){
public Void doInBackground(){
controller.someMethod(object); // This is the code I actually want to execute
return null;
}
}.execute();
}
}
}
我知道我可以编写一个方法将runnable传递给EventQueue.invokeLater()
,但我仍然需要复制所有代码来实现runnable。我实际需要运行的大多数代码除了需要在EDT或SwingWorker上运行之外没有太多共同点,因此扩展SwingWorker
或实现Runnable
是没有帮助。我的问题是,我该如何避免所有这些重复?设计有问题吗?或者有没有办法在没有所有这些开销代码的情况下进行方法调用?
答案 0 :(得分:0)
我终于解决了这个问题。我不是在更新GUI组件时在控制器中的任何地方调用EventQueue.invokeLater()
,而是将视图中的方法包装在控制器调用内部的调用中。这使我的控制器的大小减少了数百行。