SWT does not allow non-UI threads to access user interface components directly.
Thread operationThread = new Thread() {
public void run() {
// time-consuming operations
display.asyncExec/syncExec(new Runnable() {
public void run() {
// UI Updating procedures go here ...
}
});
}
};
operationThread.start();
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class AsyncExecDisplay {
static Display display = new Display();
public static void main(String[] args) {
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Button buttonAsyncExec = new Button(shell, SWT.PUSH);
buttonAsyncExec.setText("start");
buttonAsyncExec.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
buttonAsyncExec.setText("Calculation in progress ...");
getTask2(buttonAsyncExec).start();
}
});
shell.open();
while (!shell.isDisposed()) { // Event loop.
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
public static Thread getTask2(Button button) {
final Button theButton = button;
return new Thread() {
public void run() {
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
display.asyncExec(new Runnable() {
public void run() {
theButton.setText("done");
}
});
}
};
}
}
Professional Java Interfaces with SWT/JFace
by Jackwind Li Guojie
John Wiley & Sons 2005
17.117.SWT Thread |
| 17.117.1. | SWT Time-Consuming Operation UI Pattern | |