gpt4 book ai didi

java - 如何在 SWT/Swing 中收集频繁的更新/重绘/布局/刷新操作?

转载 作者:行者123 更新时间:2023-11-29 08:52:30 25 4
gpt4 key购买 nike

我正在做一些频繁的操作,这需要 GUI 刷新(将一些子项添加到控件中)。

我无法控制所有添加完成的时间,所以我无法在最后执行更新/重绘/布局/刷新,需要每一步都执行。

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

而且每次更新/重绘/布局/刷新都会减慢进程。

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

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

逻辑是否完整正确?特别是,检查 delayedMap.get(doRun) == timer 在多线程中能否正常工作?它的目的是在进入 TimerTask.run() 和内部 synchronized 之间发生进入 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);


}

}

最佳答案

你或许可以委托(delegate)给 Display.timerExec用于 invokeOnceDelayed() 方法的实现。

关于java - 如何在 SWT/Swing 中收集频繁的更新/重绘/布局/刷新操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22023768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com