在SWT中等效的javax.swing.Timer?

时间:2014-03-05 20:48:28

标签: java timer swt

我需要一些方法在用户界面线程上运行代码,延迟并具有中止等待的能力。这可以通过javax.swing.Timer中的Swing来完成。 SWT中是否有类似的功能? Display#timerExec没有明显的能力取消未来的运行。

2 个答案:

答案 0 :(得分:3)

以下是使用Display#timerExec(int, Runnable)的示例:

public static void main(String[] args)
{
    final Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new FillLayout(SWT.VERTICAL));

    final Text text = new Text(shell, SWT.BORDER);

    final Button runButton = new Button(shell, SWT.CHECK);
    runButton.setText("Stop");

    final Runnable run = new Runnable()
    {
        private int counter = 0;
        @Override
        public void run()
        {
            if(runButton.getSelection())
                return;

            text.setText(Integer.toString(counter++));

            display.timerExec(1000, this);
        }
    };

    display.timerExec(1000, run);

    runButton.addListener(SWT.Selection, new Listener()
    {
        @Override
        public void handleEvent(Event arg0)
        {
            if(!runButton.getSelection())
                display.timerExec(1000, run);
        }
    });

    shell.pack();
    shell.setSize(200, shell.getSize().y);
    shell.open();

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

答案 1 :(得分:1)

我的目标是使空闲探测器平滑用户界面。当用户在UI的一部分中进行更改时,系统将等待1000毫秒并更新UI的其他部分。如果在等待期间,例如800毫秒,用户再次进行更改,则系统取消等待该时间段并开始再次等待1000毫秒。

Swing中,这是通过一次性延迟计时器解决的。 Swing的Timer为此做好了。我想知道,如果在SWT中做同样的事情吗?

可能没有直接的等价物,所以我用util的Timer创建了一个类:

public abstract class DelayedInfrequentAction implements Runnable {

    private int delay;
    private Display display;

    private Timer timer = null;

    public DelayedInfrequentAction(Display display, int delay) {
        this.display = display;
        this.delay = delay;
    }

    public synchronized void kick() {

        if( timer != null ) {
            timer.cancel();
            timer.purge();
            timer = null;
        }

        timer = new Timer(this.getClass().getSimpleName(), true);
        timer.schedule(new TimerTask() {

            @Override
            public void run() {
                display.syncExec(DelayedInfrequentAction.this);
                synchronized (DelayedInfrequentAction.this) {
                    timer = null;
                }

            }}, delay);

    }

    @Override
    abstract public void run();

}

这不是Swing的Timer等效,而是利用utils Timer的取消能力。