JavaFX SWT and Swing-Interopt
Tom Schindl
tom.schindl at bestsolution.at
Tue Jul 31 13:16:33 UTC 2018
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
>>>>>>>>
More information about the openjfx-dev
mailing list