KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
My application is Swing-based. I would like to introduce JavaFX and configure it to render a Scene on a secondary display. I could use a JFrame to hold a JFXPanel which could hold a JFXPanel but I would like to achieve this with JavaFX API. Subclassing com.sun.glass.ui.Application and using Application.launch(this) is not an option because the invoking thread would be blocked. When instantiating a Stage from Swing EDT, the error I get is: java.lang.IllegalStateException: Toolkit not initialized Any pointers? EDIT: Conclusions Problem : Non-trivial Swing GUI application needs to run JavaFX components. Application's startup process initializes the GUI after starting up a dependent service layer. Solutions Subclass JavaFX Application class and run it in a separate thread e.g.: public class JavaFXInitializer extends Application { @Override public void start(Stage stage) throws Exception { // JavaFX should be initialized someGlobalVar.setInitialized(true); } } Sidenote: Because Application.launch() method takes a Class<? extends Application> as an argument, one has to use a global variable to signal JavaFX environment has been initialized. Alternative approach: instantiate JFXPanel in Swing Event Dispatcher Thread : final CountDownLatch latch = new CountDownLatch(1); SwingUtilities.invokeLater(new Runnable() { public void run() { new JFXPanel(); // initializes JavaFX environment latch.countDown(); } }); latch.await(); By using this approach the calling thread will wait until JavaFX environment is set up. Pick any solution you see fit. I went with the second one because it doesn't need a global variable to signal the initialization of JavaFX environment and also d
Tags (comma-separated)
Save Edits
Cancel