Javafx embedded in swing multithreaded toolkit issue
Pedro Duque Vieira
pedro.duquevieira at gmail.com
Wed Mar 21 09:51:08 PDT 2012
... or couldn't it be a requirement, to have scenes only embedded on
JFXPanel?
On Wed, Mar 21, 2012 at 2:04 PM, Pedro Duque Vieira <
pedro.duquevieira at gmail.com> wrote:
> 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
>
--
Pedro Duque Vieira
More information about the openjfx-dev
mailing list