Integrating JFX Dialog/Stage in Swing application
Jeff Martin
jeff at reportmill.com
Sat May 31 13:57:34 UTC 2014
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 <krueger at 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
More information about the openjfx-dev
mailing list