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