JavaFX SWT and Swing-Interopt

Kevin Rushforth kevin.rushforth at oracle.com
Tue Jul 31 12:19:30 UTC 2018


I ran the test program on Windows 7 using JDK-11+24 plus my local build 
of openjfx 11, and I can't reproduce the problem. I suspect that 
Prasanta is correct in that this was fixed for FX/Swing interop by 
JDK-8185634 (on the FX side) and JDK-8187803 (on the AWT side). I don't 
know why you and Tom are still seeing this bug. What platform are you 
testing on?

Note that this won't help SWT interop, though. A similar fix might be 
needed there (once we understand why the Swing interop test program 
isn't working for some of you).

-- Kevin

On 7/31/2018 4:45 AM, Michael Paus wrote:
> Hi Tom
> I gave it a try with the latest OpenJDK12ea and OpenJFX11ea and I still
> see the same baviour which you described.
> Michael
>
> Am 31.07.18 um 13:08 schrieb Tom Schindl:
>> Hi,
>>
>> I give it a try but from the bug description and discussion I would have
>> assumed it deals with the opposite problems (Opening a Swing-Dialog from
>> an JavaFX-Application who uses Swing-Node).
>>
>> I also studied the code to see if how you make a JavaFX-Stage having a
>> different owner but I could only find changes to AWT deal with this.
>>
>> Anyways I'll try to get it the latest master running. The issue states
>> that it is fixed in 8u182 but only 8u181 is available and there are no
>> EA-Builds of Java8 available anymore (Looks like Oracle does not want
>> people to test fixes for upcoming 8-update anymore)
>>
>> Tom
>>
>> On 31.07.18 11:21, Prasanta Sadhukhan wrote:
>>> Hi Tom,
>>>
>>> I am not able to see the problem in latest workspace. I believe this
>>> issue is already fixed by JDK-8185634.
>>>
>>> Regards
>>> Prasanta
>>> On 7/31/2018 1:16 PM, Tom Schindl wrote:
>>>> Hi,
>>>>
>>>> In one of our customers application we have major problems when
>>>> embedding JavaFX into SWT (but from my tests the situation is equal 
>>>> for
>>>> Swing).
>>>>
>>>> In the end all windows (most commonly popup-windows) are affected
>>>> because they don't have a parent-window assigned and so they can be
>>>> hidden by the window embedding them - if the window opened is Modal 
>>>> like
>>>> eg the one from ColorPicker the JavaFX UI is also blocked.
>>>>
>>>> To see what I mean just use this snippet below and do the following:
>>>> * Bring up the DropDown-List
>>>> * Bring up the custom color dialog
>>>> * Click somewhere in the JFrame
>>>>
>>>> You notice the following:
>>>> * JavaFX Window is moved behind Swing-Window
>>>> * JavaFX UI is blocked
>>>>
>>>>> package test;
>>>>>
>>>>> import javax.swing.JFrame;
>>>>>
>>>>> import javafx.application.Platform;
>>>>> import javafx.embed.swing.JFXPanel;
>>>>> import javafx.geometry.Pos;
>>>>> import javafx.scene.Scene;
>>>>> import javafx.scene.control.ColorPicker;
>>>>> import javafx.scene.layout.BorderPane;
>>>>>
>>>>> public class TestSwingInterop extends JFrame {
>>>>>           public TestSwingInterop() {
>>>>>          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
>>>>>          final JFXPanel fxPanel = new JFXPanel();
>>>>>           add(fxPanel);
>>>>>                    Platform.runLater(new Runnable() {
>>>>>               @Override
>>>>>               public void run() {
>>>>>                   initFX(fxPanel);
>>>>>               }
>>>>>           });
>>>>>      }
>>>>>           private static void initFX(JFXPanel fxPanel) {
>>>>>           // This method is invoked on JavaFX thread
>>>>>           Scene scene = createScene();
>>>>>           fxPanel.setScene(scene);
>>>>>       }
>>>>>           private static Scene createScene() {
>>>>>          ColorPicker picker = new ColorPicker();
>>>>>          BorderPane.setAlignment(picker, Pos.TOP_LEFT);
>>>>>          BorderPane p = new BorderPane(picker);
>>>>>                  return new Scene(p);
>>>>>      }
>>>>>
>>>>>      public static void main(String[] args) {
>>>>>          TestSwingInterop s = new TestSwingInterop();
>>>>>          s.setBounds(100, 100, 1000, 800);
>>>>>          s.setVisible(true);
>>>>>      }
>>>>> }
>>>> I've tested this on Java8 and Java9 but didn't had a chance to run 
>>>> it on
>>>> the latest master.
>>>>
>>>> The problem is that the newly created JavaFX windows don't have the
>>>> Native-Window as their parent but the EmbeddedStage (who is not 
>>>> bound to
>>>> a native-window handle). It looks like EmbeddedStage has already been
>>>> prepared (see getRawHandle() : long) to support something like that in
>>>> future but com.sun.glass.ui.Window and its subclasses have never been
>>>> extend to create a window based on a pure long-pointer.
>>>>
>>>> The only exception and the reason I guess the strategy would work was
>>>> used for Applets.
>>>>
>>>> Before diving deeper into this I wanted to get a feedback from people
>>>> who know things better: Does the strategy of passing along the window
>>>> pointer (eg from SWT, don't know about Swing yet) to Glass and 
>>>> using it
>>>> as the parent pointer sound like a proper idea?
>>>>
>>>> Tom
>>>>
>



More information about the openjfx-dev mailing list