package interop; import com.sun.glass.ui.Application; import com.sun.glass.ui.InvokeLaterDispatcher; import javafx.embed.swt.FXCanvas; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Display; public class RT33258 { static public void test() { Display display = Display.getDefault(); Shell shell = new Shell(display.getActiveShell(),SWT.MODELESS | SWT.BORDER | SWT.CLOSE); shell.setLayout(new FillLayout()); // fx open shell button FXCanvas fxCanvas = new FXCanvas(shell, SWT.NONE); StackPane pane = new StackPane(); pane.setPadding(new Insets(10)); Button button = new Button("FX Open Shell"); button.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { test(); } }); pane.getChildren().add(button); Scene scene = new Scene(pane); fxCanvas.setScene(scene); // swt open shell button org.eclipse.swt.widgets.Button b = new org.eclipse.swt.widgets.Button(shell, SWT.NONE); b.setText("SWT Open Shell"); b.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { test(); } }); shell.pack(); shell.open (); /* event loop - processes swt/fx events if test() was called from swt - processes only swt but no fx events if test() was called from fx all fx events during this time will be processed only after the event loop terminates */ while (!shell.isDisposed()) { try { if (!display.readAndDispatch()) { display.sleep(); } } catch (Throwable e) { e.printStackTrace(); } } } // lockup does not occur if this is run as a standalone swt app public static void main(String[] args) { test(); } }