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