2014-02-25 31 views
2

我正在做一些频繁的操作,需要刷新GUI(将一些孩子添加到控件中)。如何在SWT/Swing中收集频繁更新/重绘/布局/刷新操作?

我无法控制整个添加完成的时刻,所以我不能在最后更新/重绘/布局/刷新,并且需要每一步完成。

同时我需要非常频繁点头,因为用户不需要看到每个变化。

此外,每次更新/重绘/布局/刷新都会降低处理速度。

所以,我需要决定是否按时间更新/重绘/布局/刷新。

我为SWT编写了以下一般类,但类似的也适用于Swing。

它是逻辑完整和正确的吗?特别是,检查delayedMap.get(doRun) == timer将在多线程中正常工作吗?如果在输入TimerTask.run()和内部​​块之间发生输入invokeOnceDelayed()方法的情况下,取消延迟操作的目的是取消?

public class SWTUtilities { 

    private static HashMap<Runnable, Timer> delayedMap = new HashMap<Runnable, Timer>(); 

    public static void invokeLater(Runnable doRun) { 
     Display.getDefault().asyncExec(doRun); 
    } 

    public static void invokeAndWait(Runnable doRun) { 
     Display.getDefault().syncExec(doRun); 
    } 

    public static synchronized void invokeOnceDelayed(final Runnable doRun, long delay) { 

     final Timer timer = new Timer(true); 
     Timer oldTimer = delayedMap.put(doRun, timer); 
     if(oldTimer != null) { 
      oldTimer.cancel(); 
     } 

     timer.schedule(new TimerTask() { 

      @Override 
      public void run() { 
       synchronized(SWTUtilities.class) { 
        if(delayedMap.get(doRun) == timer) { 
         invokeLater(doRun); 
        } 
       } 

      }}, delay); 


    } 

} 

回答