在SWT上显示时钟或者做定时器操作,如果直接使用java.util.timer操作,会显示线程错误。原因如下:
Widget.java中有以下检查线程一致性的代码
因此,由于Timer启动的TimerTask进程与display进程不一致,故会抛出thread invalid access错误。
以下是在界面显示时钟的办法。其它定时器操作请参考以下以下代码做修改:
Widget.java中有以下检查线程一致性的代码
protected
void
checkWidget ()
{
Display display = this.display;
if (display == null) error (SWT.ERROR_WIDGET_DISPOSED);
if (display.thread != Thread.currentThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
if ((state & DISPOSED) != 0) error (SWT.ERROR_WIDGET_DISPOSED);
}
Display display = this.display;
if (display == null) error (SWT.ERROR_WIDGET_DISPOSED);
if (display.thread != Thread.currentThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
if ((state & DISPOSED) != 0) error (SWT.ERROR_WIDGET_DISPOSED);
}
以下是在界面显示时钟的办法。其它定时器操作请参考以下以下代码做修改:
int
time
=
1000
;
Runnable showTime = new Runnable() {
public void run() {
Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("hh:mm:ss");
label.setText(dateFormat.format(date));//已定义的用于显示时钟的label
display.timerExec(time, this);
}
} ;
display.timerExec( 1000 ,showTime); // 你的swt程序的display
Runnable showTime = new Runnable() {
public void run() {
Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("hh:mm:ss");
label.setText(dateFormat.format(date));//已定义的用于显示时钟的label
display.timerExec(time, this);
}
} ;
display.timerExec( 1000 ,showTime); // 你的swt程序的display