Javafx embedded in swing multithreaded toolkit issue

Pedro Duque Vieira pedro.duquevieira at gmail.com
Wed Mar 21 07:04:18 PDT 2012


Hi Artem, thanks for the reply.

If FX lived on Swing event dispatch thread, all the FX top-level windows
> (that are not embedded into JFXPanel) would never receive any events.
>
In this scenario (embedding javafx in swing), what situations would there
be on which top level windows aren't embedded into JFXPanel?

I think this problem is very important. If things continue as they are,
embedding javafx into swing will be virtually impossible as this blog post
illustrates:
http://weblogs.java.net/blog/kgh/archive/2004/10/multithreaded_t.html

Cheers,

On Wed, Mar 21, 2012 at 9:23 AM, Artem Ananiev <artem.ananiev at oracle.com>wrote:

>
> On 3/21/2012 6:17 AM, Pedro Duque Vieira wrote:
>
>> Hi,
>>
>> I've been working for a while on a swing app that has a javafx scene
>> embedded on it.
>>
>> So in this scenario we have two UI threads, one for the swing part and one
>> for the javafx scene (the application thread).
>> This situation creates a multithreaded ui toolkit which is basically a
>> nightmare for development.
>>
>> I don't know if this is possible but it I think it would be best to merge
>> the swing and the javafx application thread into one when on this
>> scenario.
>>
>
> In JavaFX/SWT bridge (FXCanvas) we do exactly this: FX application thread
> is the same as SWT event thread. Unfortunately, in JavaFX/Swing case it is
> not possible.
>
> In a few words, Swing event dispatch thread only pumps Java events. All
> the native events are dispatched on another thread, which is called AWT
> toolkit thread. This thread cannot be accessed from outside of AWT, it's
> not a part of public API. If FX lived on Swing event dispatch thread, all
> the FX top-level windows (that are not embedded into JFXPanel) would never
> receive any events.
>
> Thanks,
>
> Artem
>
>
>  One other possible solution that comes to my mind  and also a much simpler
>> and quicker one is to add a Platform.invokeAndWait(like what exists on
>> swing) alongside the Platform.runLater to the javafx API.
>> And each time I want to invoke something on the javafx App thread from the
>> swing ui thread I call invokeAndWait instead of runLater. So effectively
>> the two UI threads become only one, because they are not running
>> concurrently but sequentially instead.
>>
>


-- 
Pedro Duque Vieira


More information about the openjfx-dev mailing list