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

Reply via email to