Java 如何在SWT/Swing中收集频繁的更新/重画/布局/刷新操作?
我正在做一些频繁的操作,这需要GUI刷新(向控件添加一些子控件) 我无法控制全部添加完成的时间,因此我无法在最后进行更新/重画/布局/刷新,需要每一步都进行 同时,我需要点头做它非常频繁,因为用户不需要看到每一个变化 此外,每次更新/重画/布局/刷新都会减慢进程 因此,我需要决定是否按时间更新/重画/布局/刷新 我为SWT编写了以下通用类,但类似的类也适用于Swing 它的逻辑是否完整和正确?特别是,检查Java 如何在SWT/Swing中收集频繁的更新/重画/布局/刷新操作?,java,multithreading,swing,event-handling,swt,Java,Multithreading,Swing,Event Handling,Swt,我正在做一些频繁的操作,这需要GUI刷新(向控件添加一些子控件) 我无法控制全部添加完成的时间,因此我无法在最后进行更新/重画/布局/刷新,需要每一步都进行 同时,我需要点头做它非常频繁,因为用户不需要看到每一个变化 此外,每次更新/重画/布局/刷新都会减慢进程 因此,我需要决定是否按时间更新/重画/布局/刷新 我为SWT编写了以下通用类,但类似的类也适用于Swing 它的逻辑是否完整和正确?特别是,检查delayedMap.get(doRun)=timer在多线程中是否正常工作?如果在输入Ti
delayedMap.get(doRun)=timer
在多线程中是否正常工作?如果在输入TimerTask.run()
和内部synchronized
块之间出现输入invokeonCelayed()
方法,则其目的是取消延迟操作
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);
}
}
公共类软件{
private static HashMap delayedMap=new HashMap();
公共静态void调用器(可运行的doRun){
Display.getDefault().asyncExec(doRun);
}
公共静态void invokeAndWait(可运行的doRun){
Display.getDefault().syncExec(doRun);
}
公共静态同步的void invokeonCelayed(最终可运行的doRun,长延迟){
最终计时器=新计时器(真);
定时器oldTimer=delayedMap.put(多伦,定时器);
if(oldTimer!=null){
oldTimer.cancel();
}
timer.schedule(新TimerTask(){
@凌驾
公开募捐{
同步(SWTUtilities.class){
if(delayedMap.get(doRun)==计时器){
调用器(多伦);
}
}
}},延误);
}
}
对于invokeonCelayed()方法的实现,您可能只需委托给即可