2014-02-25 80 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); 


    } 

} 

回答