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
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
> 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:
>>> 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
>>> 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
>> 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.
>> One other possible solution that comes to my mind and also a much
>>> 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
>>> 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