JavaFX SWT and Swing-Interopt

Tom Schindl tom.schindl at bestsolution.at
Wed Aug 1 20:00:49 UTC 2018


I logged https://bugs.openjdk.java.net/browse/JDK-8208649

Tom

On 31.07.18 22:14, Tom Schindl wrote:
> Hi,
> 
> I could not resist giving my idea a try and passing the native-pointer
> from SWT completely through JavaFX and using it as a parent on Windows
> created by FX.
> 
> Although my C/Objective-C knowledge is next to useless it works and now
> Popup-Windows (eg created by a DropDown are a Native-Child of their
> SWT-NSWindow which means they move if you move the window, they don't
> hide behind their parent, ...) - they just work as they do in a native
> JavaFX application!
> 
> I'll create an issue and we can move the discussion there.
> 
> Tom
> 
> On 31.07.18 15:16, Tom Schindl wrote:
>> hi,
>>
>> yes and I can confirm that the date-picker issue is not that dramatic on
>> Windows. If I modify my test case just a bit by opening my own stage
>> with a parent-stage the z-order at least can also get messed up on windows.
>>
>> 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.Button;
>> import javafx.scene.control.ColorPicker;
>> import javafx.scene.layout.BorderPane;
>> import javafx.stage.Stage;
>>
>> 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);
>>             }
>>         });
>>     }
>>
>>     static void initFX(JFXPanel fxPanel) {
>>         // This method is invoked on JavaFX thread
>>         Scene scene = createScene();
>>         fxPanel.setScene(scene);
>>     }
>>
>>     static Scene createScene() {
>>         ColorPicker picker = new ColorPicker();
>>         BorderPane.setAlignment(picker, Pos.TOP_LEFT);
>>         BorderPane p = new BorderPane(picker);
>>         Button button = new Button("Extra Stage");
>>         button.setOnAction( evt -> {
>>             Stage s = new Stage();
>>             s.setScene(new Scene(new BorderPane(new Button("Hello
>> World")), 300, 300));
>>             s.initOwner(button.getScene().getWindow());
>>             s.show();
>>         });
>>         p.setBottom(button);
>>
>>         return new Scene(p);
>>     }
>>
>>     public static void main(String[] args) {
>>         TestSwingInterop s = new TestSwingInterop();
>>         s.setBounds(100, 100, 1000, 800);
>>         s.setVisible(true);
>>     }
>> }
>>
>> package test;
>>
>> import javafx.application.Application;
>> import javafx.stage.Stage;
>>
>> public class TestPlainFX extends Application {
>>
>>     @Override
>>     public void start(Stage primaryStage) throws Exception {
>>         primaryStage.setScene(TestSwingInterop.createScene());
>>         primaryStage.show();
>>     }
>>
>>     public static void main(String[] args) {
>>         launch(args);
>>     }
>> }
>>
>> If you run an click the "Extra - Stage" Button you'll notice that the
>> main Swing window can get infront of it child (this is a similar problem
>> than the Picker). The same does not work if you are in pure FX.
>>
>> Tom
>> Am 2018-07-31 14:57, schrieb Kevin Rushforth:
>>> OK, I can reproduce it on Mac using JDK 11-ea and the latest jfx-dev.
>>> Can you file a bug?
>>>
>>> -- Kevin
>>>
>>>
>>> On 7/31/2018 5:51 AM, Tom Schindl wrote:
>>>> Hi,
>>>>
>>>> I'm on Mac as well and just gave 8u181 a spin and see the same problem
>>>> (beside others eg the DropDown popup does not move with window).
>>>>
>>>> Just to make sure: It is curcial to not only bring up the DropDown-List
>>>> but also open the Dialog-Window with the color-spectrum, ... .
>>>>
>>>> Tom
>>>>
>>>> On 31.07.18 14:34, Michael Paus wrote:
>>>>> I did the test on a Mac.
>>>>>
>>>>> MacOS High Sierra
>>>>> OpenJDK12ea4
>>>>> OpenJFX11ea20 (SDK)
>>>>>
>>>>> I just ran the code and repeated the steps given by Tom.
>>>>> * Bring up the DropDown-List
>>>>> * Bring up the custom color dialog
>>>>> * Click somewhere in the JFrame
>>>>>
>>>>> Michael
>>>>>
>>>>> Am 31.07.18 um 14:19 schrieb Kevin Rushforth:
>>>>>> 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
>>>>>>>>>>
> 

-- 
Tom Schindl, CTO
BestSolution.at EDV Systemhaus GmbH
Eduard-Bodem-Gasse 5-7. A-6020 Innsbruck
Reg. Nr. FN 222302s am Firmenbuchgericht Innsbruck


More information about the openjfx-dev mailing list