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);
}
}