JavaFX SWT and Swing-Interopt

Prasanta Sadhukhan prasanta.sadhukhan at oracle.com
Tue Jul 31 09:21:48 UTC 2018


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