Re: Integrating JFX Dialog/Stage in Swing application
Platform.setImplicitExit(false) This is the correct answer. Please see the javadoc for more details. -- best regards, Anthony On 5/31/2014 10:19 PM, Jeff Martin wrote: You might try calling that new JFXPanel() in your application main. Maybe go ahead and call Platform.setImplicitExit(false) as well. jeff On May 31, 2014, at 9:46 AM, Robert Krüger krue...@lesspain.de wrote: That was quicker than I had hoped. Invoking close() on the stage constructed in this way results in this here: [ERROR|16:24:23] d.l.m.MediaTool Uncaught exception in thread JavaFX Application Thread: [JavaFX Application Thread] java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = JavaFX Application Thread at com.sun.glass.ui.Application.checkEventThread(Application.java:427) ~[jfxrt.jar:na] at com.sun.glass.ui.View.isClosed(View.java:409) ~[jfxrt.jar:na] at com.sun.glass.ui.mac.MacTouchInputSupport.notifyNextTouchEvent(MacTouchInputSupport.java:122) ~[jfxrt.jar:na] at com.sun.glass.ui.mac.MacGestureSupport.notifyNextTouchEvent(MacGestureSupport.java:77) ~[jfxrt.jar:na] I checked in the debugger and com.sun.glass.ui.Application#eventThread is null. This makes me believe the environment is not properly initialized despite the invocation on new JFXPanel() that I have in the EDT before the stage is built. On Sat, May 31, 2014 at 4:15 PM, Robert Krüger krue...@lesspain.de wrote: Hi Jeff, thanks, yeah, that's a workaround I have also found. I am just asking myself (and the JFX developers on this list) why this kind of Integration is not supported directly. Good to know that you have used this quite a bit. So I'll try using it until someone brings up a nicer solution or I run into any problems :-). Cheers, Robert On Sat, May 31, 2014 at 3:57 PM, Jeff Martin j...@reportmill.com wrote: I'm sure this isn't the proper answer, but I have used this call to initialize the FX toolkit on demand from various Swing contexts and it has always worked for me: new javafx.embed.swing.JFXPanel(); Then you would need the Platform.runLater(). Usually for the whole method that creates your UI and shows the Stage. In some cases, I would make the first line of my method that ends up invoking the JFX dialog something like this: public void doSomething() { // Ensure we're on FX thread if(!Platform.isFXApplicationThread()) { Platform.runLater(new Runnable() { public void run() { doSomething(); } return; } … create FX UI and do stage.show() ... } I've done quite a bit of this and it works without problems (for me). jeff martin On May 31, 2014, at 7:27 AM, Robert Krüger krue...@lesspain.de wrote: Hi, I am trying something which I thought would technically be the easiest way of migrating parts of an existing application from Swing to JFX, i.e. have a Swing JMenuItem trigger the showing of a JFX stage because I thought this would technically even be cleaner than to have a swing dialog containing an JFXPanel. Doing this results in the following Exception: java.lang.IllegalStateException: Toolkit not initialized at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:276) ~[jfxrt.jar:na] at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:271) ~[jfxrt.jar:na] at javafx.application.Platform.runLater(Platform.java:78) ~[jfxrt.jar:na] at de.lesspain.mediatool.menu.ToolsSubmenu$1.actionPerformed(ToolsSubmenu.java:20) ~[ javadoc of runLater states: This method must not be called before the FX runtime has been initialized. For standard JavaFX applications that extend Application, and use either the Java launcher or one of the launch methods in the Application class to launch the application, the FX runtime is initialized by the launcher before the Application class is loaded. For Swing applications that use JFXPanel to display FX content, the FX runtime is initialized when the first JFXPanel instance is constructed. So this is consistent. Still I am wondering, why it should not be supported to just trigger opening a stage from a Swing menu? Either by Platform.runLater autoinitializing or offering a separate method like Platform.ensureInitialized(). Am I missing something obvious? Thanks, Robert -- Robert Krüger Managing Partner Lesspain GmbH Co. KG www.lesspain-software.com -- Robert Krüger Managing Partner Lesspain GmbH Co. KG www.lesspain-software.com
Integrating JFX Dialog/Stage in Swing application
Hi, I am trying something which I thought would technically be the easiest way of migrating parts of an existing application from Swing to JFX, i.e. have a Swing JMenuItem trigger the showing of a JFX stage because I thought this would technically even be cleaner than to have a swing dialog containing an JFXPanel. Doing this results in the following Exception: java.lang.IllegalStateException: Toolkit not initialized at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:276) ~[jfxrt.jar:na] at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:271) ~[jfxrt.jar:na] at javafx.application.Platform.runLater(Platform.java:78) ~[jfxrt.jar:na] at de.lesspain.mediatool.menu.ToolsSubmenu$1.actionPerformed(ToolsSubmenu.java:20) ~[ javadoc of runLater states: This method must not be called before the FX runtime has been initialized. For standard JavaFX applications that extend Application, and use either the Java launcher or one of the launch methods in the Application class to launch the application, the FX runtime is initialized by the launcher before the Application class is loaded. For Swing applications that use JFXPanel to display FX content, the FX runtime is initialized when the first JFXPanel instance is constructed. So this is consistent. Still I am wondering, why it should not be supported to just trigger opening a stage from a Swing menu? Either by Platform.runLater autoinitializing or offering a separate method like Platform.ensureInitialized(). Am I missing something obvious? Thanks, Robert
Re: Integrating JFX Dialog/Stage in Swing application
Hi Jeff, thanks, yeah, that's a workaround I have also found. I am just asking myself (and the JFX developers on this list) why this kind of Integration is not supported directly. Good to know that you have used this quite a bit. So I'll try using it until someone brings up a nicer solution or I run into any problems :-). Cheers, Robert On Sat, May 31, 2014 at 3:57 PM, Jeff Martin j...@reportmill.com wrote: I'm sure this isn't the proper answer, but I have used this call to initialize the FX toolkit on demand from various Swing contexts and it has always worked for me: new javafx.embed.swing.JFXPanel(); Then you would need the Platform.runLater(). Usually for the whole method that creates your UI and shows the Stage. In some cases, I would make the first line of my method that ends up invoking the JFX dialog something like this: public void doSomething() { // Ensure we're on FX thread if(!Platform.isFXApplicationThread()) { Platform.runLater(new Runnable() { public void run() { doSomething(); } return; } … create FX UI and do stage.show() ... } I've done quite a bit of this and it works without problems (for me). jeff martin On May 31, 2014, at 7:27 AM, Robert Krüger krue...@lesspain.de wrote: Hi, I am trying something which I thought would technically be the easiest way of migrating parts of an existing application from Swing to JFX, i.e. have a Swing JMenuItem trigger the showing of a JFX stage because I thought this would technically even be cleaner than to have a swing dialog containing an JFXPanel. Doing this results in the following Exception: java.lang.IllegalStateException: Toolkit not initialized at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:276) ~[jfxrt.jar:na] at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:271) ~[jfxrt.jar:na] at javafx.application.Platform.runLater(Platform.java:78) ~[jfxrt.jar:na] at de.lesspain.mediatool.menu.ToolsSubmenu$1.actionPerformed(ToolsSubmenu.java:20) ~[ javadoc of runLater states: This method must not be called before the FX runtime has been initialized. For standard JavaFX applications that extend Application, and use either the Java launcher or one of the launch methods in the Application class to launch the application, the FX runtime is initialized by the launcher before the Application class is loaded. For Swing applications that use JFXPanel to display FX content, the FX runtime is initialized when the first JFXPanel instance is constructed. So this is consistent. Still I am wondering, why it should not be supported to just trigger opening a stage from a Swing menu? Either by Platform.runLater autoinitializing or offering a separate method like Platform.ensureInitialized(). Am I missing something obvious? Thanks, Robert -- Robert Krüger Managing Partner Lesspain GmbH Co. KG www.lesspain-software.com
Re: Integrating JFX Dialog/Stage in Swing application
That was quicker than I had hoped. Invoking close() on the stage constructed in this way results in this here: [ERROR|16:24:23] d.l.m.MediaTool Uncaught exception in thread JavaFX Application Thread: [JavaFX Application Thread] java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = JavaFX Application Thread at com.sun.glass.ui.Application.checkEventThread(Application.java:427) ~[jfxrt.jar:na] at com.sun.glass.ui.View.isClosed(View.java:409) ~[jfxrt.jar:na] at com.sun.glass.ui.mac.MacTouchInputSupport.notifyNextTouchEvent(MacTouchInputSupport.java:122) ~[jfxrt.jar:na] at com.sun.glass.ui.mac.MacGestureSupport.notifyNextTouchEvent(MacGestureSupport.java:77) ~[jfxrt.jar:na] I checked in the debugger and com.sun.glass.ui.Application#eventThread is null. This makes me believe the environment is not properly initialized despite the invocation on new JFXPanel() that I have in the EDT before the stage is built. On Sat, May 31, 2014 at 4:15 PM, Robert Krüger krue...@lesspain.de wrote: Hi Jeff, thanks, yeah, that's a workaround I have also found. I am just asking myself (and the JFX developers on this list) why this kind of Integration is not supported directly. Good to know that you have used this quite a bit. So I'll try using it until someone brings up a nicer solution or I run into any problems :-). Cheers, Robert On Sat, May 31, 2014 at 3:57 PM, Jeff Martin j...@reportmill.com wrote: I'm sure this isn't the proper answer, but I have used this call to initialize the FX toolkit on demand from various Swing contexts and it has always worked for me: new javafx.embed.swing.JFXPanel(); Then you would need the Platform.runLater(). Usually for the whole method that creates your UI and shows the Stage. In some cases, I would make the first line of my method that ends up invoking the JFX dialog something like this: public void doSomething() { // Ensure we're on FX thread if(!Platform.isFXApplicationThread()) { Platform.runLater(new Runnable() { public void run() { doSomething(); } return; } … create FX UI and do stage.show() ... } I've done quite a bit of this and it works without problems (for me). jeff martin On May 31, 2014, at 7:27 AM, Robert Krüger krue...@lesspain.de wrote: Hi, I am trying something which I thought would technically be the easiest way of migrating parts of an existing application from Swing to JFX, i.e. have a Swing JMenuItem trigger the showing of a JFX stage because I thought this would technically even be cleaner than to have a swing dialog containing an JFXPanel. Doing this results in the following Exception: java.lang.IllegalStateException: Toolkit not initialized at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:276) ~[jfxrt.jar:na] at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:271) ~[jfxrt.jar:na] at javafx.application.Platform.runLater(Platform.java:78) ~[jfxrt.jar:na] at de.lesspain.mediatool.menu.ToolsSubmenu$1.actionPerformed(ToolsSubmenu.java:20) ~[ javadoc of runLater states: This method must not be called before the FX runtime has been initialized. For standard JavaFX applications that extend Application, and use either the Java launcher or one of the launch methods in the Application class to launch the application, the FX runtime is initialized by the launcher before the Application class is loaded. For Swing applications that use JFXPanel to display FX content, the FX runtime is initialized when the first JFXPanel instance is constructed. So this is consistent. Still I am wondering, why it should not be supported to just trigger opening a stage from a Swing menu? Either by Platform.runLater autoinitializing or offering a separate method like Platform.ensureInitialized(). Am I missing something obvious? Thanks, Robert -- Robert Krüger Managing Partner Lesspain GmbH Co. KG www.lesspain-software.com -- Robert Krüger Managing Partner Lesspain GmbH Co. KG www.lesspain-software.com
Re: Integrating JFX Dialog/Stage in Swing application
You might try calling that new JFXPanel() in your application main. Maybe go ahead and call Platform.setImplicitExit(false) as well. jeff On May 31, 2014, at 9:46 AM, Robert Krüger krue...@lesspain.de wrote: That was quicker than I had hoped. Invoking close() on the stage constructed in this way results in this here: [ERROR|16:24:23] d.l.m.MediaTool Uncaught exception in thread JavaFX Application Thread: [JavaFX Application Thread] java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = JavaFX Application Thread at com.sun.glass.ui.Application.checkEventThread(Application.java:427) ~[jfxrt.jar:na] at com.sun.glass.ui.View.isClosed(View.java:409) ~[jfxrt.jar:na] at com.sun.glass.ui.mac.MacTouchInputSupport.notifyNextTouchEvent(MacTouchInputSupport.java:122) ~[jfxrt.jar:na] at com.sun.glass.ui.mac.MacGestureSupport.notifyNextTouchEvent(MacGestureSupport.java:77) ~[jfxrt.jar:na] I checked in the debugger and com.sun.glass.ui.Application#eventThread is null. This makes me believe the environment is not properly initialized despite the invocation on new JFXPanel() that I have in the EDT before the stage is built. On Sat, May 31, 2014 at 4:15 PM, Robert Krüger krue...@lesspain.de wrote: Hi Jeff, thanks, yeah, that's a workaround I have also found. I am just asking myself (and the JFX developers on this list) why this kind of Integration is not supported directly. Good to know that you have used this quite a bit. So I'll try using it until someone brings up a nicer solution or I run into any problems :-). Cheers, Robert On Sat, May 31, 2014 at 3:57 PM, Jeff Martin j...@reportmill.com wrote: I'm sure this isn't the proper answer, but I have used this call to initialize the FX toolkit on demand from various Swing contexts and it has always worked for me: new javafx.embed.swing.JFXPanel(); Then you would need the Platform.runLater(). Usually for the whole method that creates your UI and shows the Stage. In some cases, I would make the first line of my method that ends up invoking the JFX dialog something like this: public void doSomething() { // Ensure we're on FX thread if(!Platform.isFXApplicationThread()) { Platform.runLater(new Runnable() { public void run() { doSomething(); } return; } … create FX UI and do stage.show() ... } I've done quite a bit of this and it works without problems (for me). jeff martin On May 31, 2014, at 7:27 AM, Robert Krüger krue...@lesspain.de wrote: Hi, I am trying something which I thought would technically be the easiest way of migrating parts of an existing application from Swing to JFX, i.e. have a Swing JMenuItem trigger the showing of a JFX stage because I thought this would technically even be cleaner than to have a swing dialog containing an JFXPanel. Doing this results in the following Exception: java.lang.IllegalStateException: Toolkit not initialized at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:276) ~[jfxrt.jar:na] at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:271) ~[jfxrt.jar:na] at javafx.application.Platform.runLater(Platform.java:78) ~[jfxrt.jar:na] at de.lesspain.mediatool.menu.ToolsSubmenu$1.actionPerformed(ToolsSubmenu.java:20) ~[ javadoc of runLater states: This method must not be called before the FX runtime has been initialized. For standard JavaFX applications that extend Application, and use either the Java launcher or one of the launch methods in the Application class to launch the application, the FX runtime is initialized by the launcher before the Application class is loaded. For Swing applications that use JFXPanel to display FX content, the FX runtime is initialized when the first JFXPanel instance is constructed. So this is consistent. Still I am wondering, why it should not be supported to just trigger opening a stage from a Swing menu? Either by Platform.runLater autoinitializing or offering a separate method like Platform.ensureInitialized(). Am I missing something obvious? Thanks, Robert -- Robert Krüger Managing Partner Lesspain GmbH Co. KG www.lesspain-software.com -- Robert Krüger Managing Partner Lesspain GmbH Co. KG www.lesspain-software.com
Re: Integrating JFX Dialog/Stage in Swing application
Hi Robert, the problem with this is that the stage cannot have a swing window as its owner. If users misclick the stage will hide behind your main window. But if that is acceptable... Werner On 31.05.2014 14:27, Robert Krüger wrote: have a Swing JMenuItem trigger the showing of a JFX stage