我正在为MAC OS开发一个SWT java项目,我需要在SWT UI上添加一个标签,在那里我必须显示当前时间,每秒更新一次。
final Label lblNewLabel_1 = new Label(composite, SWT.CENTER);
FormData fd_lblNewLabel_1 = new FormData();
fd_lblNewLabel_1.left = new FormAttachment(btnNewButton_call, 10);
fd_lblNewLabel_1.bottom = new FormAttachment(100, -10);
fd_lblNewLabel_1.right = new FormAttachment(btnTransfer, -10);
fd_lblNewLabel_1.height = 20;
lblNewLabel_1.setLayoutData(fd_lblNewLabel_1);
getDisplay().syncExec(new Runnable() {
@Override
public void run() {
while(true){
lblNewLabel_1.setText(Calendar.getInstance().getTime().toString());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
但是它不工作,请帮我做。
最好使用org.eclipse.swt.widgets.Display.timerExec(int, Runnable)
方法及时更新UI
你不是在从另一个线程更新UI -你是在从UI线程本身更新UI。
在UI线程上的sleep
将阻止UI线程做诸如绘画之类的事情,因此看起来你的程序已经挂起了。
而不是调度UI线程运行一个Runnable
,更新一个小部件和睡眠一秒钟,你想要一个线程每秒钟睡眠,然后调度一个Runnable
更新小部件,然后快速退出。
while(true)
{
getDisplay().asyncExec(new Runnable() {
lblNewLabel_1.setText(Calendar.getInstance().getTime().toString());
});
Thread.sleep(1000);
}
我就是这样做的
Thread timeThread = new Thread() {
public void run() {
while (true) {
display.syncExec(new Runnable() {
@Override
public void run() {
lblNewLabel_1.setText(Calendar.getInstance().getTime().toString());
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
timeThread.setDaemon(true);
timeThread.start();