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

Reply via email to