import org.eclipse.jface.window.ApplicationWindow; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; public class SWTTest extends ApplicationWindow { private Thread uiThread; private Button button; public SWTTest() { super(null); } @Override protected Control createContents(Composite parent) { getShell().setText("SWTTest"); getShell().setSize(400, 100); Composite c = new Composite(parent, SWT.NONE); c.setLayout(new FillLayout()); button = new Button(c, SWT.NONE); button.setText("Hello"); return parent; } public Display getDisplay() { // Calling Display.getCurrent() will most likely throw // a NUllPointerException if it's called from a main thread. // The correct way to get the Display instance is by passing the // UI thread return Display.findDisplay(uiThread); } public void start() { // We store the UI thread for the getDisplay() method uiThread= Thread.currentThread(); setBlockOnOpen(true); open(); } public void updateText(final String text) { // Any SWT operations must be done in a UI thread, so we must // use getDisplay().syncExec() or getDisplay().asyncExec(). getDisplay().syncExec(new Runnable() { @Override public void run() { button.setText(text); } }); } public void stop() { // Any SWT operations must be done in a UI thread, so we must // use getDisplay().syncExec() or getDisplay().asyncExec(). getDisplay().syncExec(new Runnable() { @Override public void run() { close(); getDisplay().dispose(); } }); } public static void main(String[] args) throws Exception { final SWTTest app = new SWTTest(); // app.start() blocks, so we need to start it in a new thread. new Thread(new Runnable() { @Override public void run() { System.out.println("Starting the GUI"); app.start(); } }).start(); System.out.println("Sleeping for 3 secs"); Thread.sleep(3000); System.out.println("Updating the GUI"); app.updateText("Bye"); System.out.println("Sleeping for 3 secs"); Thread.sleep(3000); System.out.println("Stopping the GUI"); app.stop(); } }
Monday, May 14, 2012
How to Access SWT UI Components from Non-UI Thread
Accessing SWT components in a non-UI thread will cause an SWTException (invalid thread access) to be thrown. This example shows how an SWT application is started in a non-main thread and the main thread manipulates the SWT application by updating the text in the button and stopping the SWT application.
Subscribe to:
Post Comments (Atom)
Nice; short, clear and concise answer to an annoying problem.
ReplyDelete