从EContentAdapter更新UI的正确方法

时间:2013-02-20 17:23:36

标签: java user-interface eclipse-emf eclipse-emf-ecore emf

我有一个econtent适配器,它实质上导致了许多表的刷新。虽然理论上可以将所有通知过滤到应该导致表刷新的确切通知,但由于我们有一个庞大的模型,许多不同的事件和变化可能会触发,因此非常困难和耗时。刷新。此外,经常发生的是单个“用户事件”(如在我们的应用程序中单击state-> new),触发在幕后创建的4个对象,从通知的角度来看,所有这些对象都非常相似,因此很难过滤掉。我想知道是否有一种很好的方法来做某种“延迟工作”,这样4个通知只会导致一次刷新。例如,类似于:

public void notifyChanged(final Notification notification)
     super.notifyChanged(notification);
     @Override
     public void run() {
         if(matchesFilters(notification)) { 
           //some sort of check to see if we recently had another event that would have triggered a refresh?
           if(!schedulingJob) {
              scheduleDelayedJob();
           }
         }  
     }
 }

不幸的是,我在工作和类似的事情上几乎没有经验,所以如果有人能够以正确的方式提供帮助,那将会非常有帮助。

作为另一个例子,如果有人在我们的应用程序中非常快速地点击控制-N 20次,它将快速创建20个新状态,我们只想在这20个通知结束时更新UI,而不是刷新20次。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,Eclipse会为您提供所需的一切。首先,应该在Display线程上更新GUI。其次,有一种异步执行的方法,如下所示:

final IWorkbench workbench = PlatformUI.getWorkbench();
workbench.getDisplay().asyncExec(new Runnable() {
  public void run() {
    // Do your thing, e.g. refresh()
  }
});

您在Runner中所做的工作取决于GUI框架。如果你正在使用JFace,你可以做一个refresh(),我认为这是排队工作的明智之处。