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