Java 如何在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

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

我无法控制全部添加完成的时间,因此我无法在最后进行更新/重画/布局/刷新,需要每一步都进行

同时,我需要点头做它非常频繁,因为用户不需要看到每一个变化

此外,每次更新/重画/布局/刷新都会减慢进程

因此,我需要决定是否按时间更新/重画/布局/刷新

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

它的逻辑是否完整和正确?特别是,检查
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()方法的实现,您可能只需委托给即可