通过多次调用EventQueue.invokeLater()避免代码重复

时间:2014-10-15 03:03:27

标签: java swing model-view-controller event-dispatch-thread code-duplication

所以,我有一个使用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是没有帮助。我的问题是,我该如何避免所有这些重复?设计有问题吗?或者有没有办法在没有所有这些开销代码的情况下进行方法调用?

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题。我不是在更新GUI组件时在控制器中的任何地方调用EventQueue.invokeLater(),而是将视图中的方法包装在控制器调用内部的调用中。这使我的控制器的大小减少了数百行。