< prev index next >

modules/javafx.swing/src/main/java/javafx/embed/swing/JFXPanel.java

Print this page

        

@@ -36,10 +36,11 @@
 import java.awt.Point;
 import java.awt.Window;
 import java.awt.Insets;
 import java.awt.EventQueue;
 import java.awt.SecondaryLoop;
+import java.awt.GraphicsEnvironment;
 import java.awt.event.AWTEventListener;
 import java.awt.event.ComponentEvent;
 import java.awt.event.FocusEvent;
 import java.awt.event.HierarchyEvent;
 import java.awt.event.InputEvent;

@@ -75,17 +76,21 @@
 import com.sun.javafx.PlatformUtil;
 import java.awt.event.InvocationEvent;
 
 import java.lang.reflect.Method;
 import java.util.concurrent.atomic.AtomicInteger;
-import sun.awt.AppContext;
-import sun.awt.SunToolkit;
-import sun.java2d.SunGraphics2D;
-import sun.java2d.SurfaceData;
+
 import com.sun.javafx.logging.PlatformLogger;
 import com.sun.javafx.logging.PlatformLogger.Level;
 
+import com.sun.javafx.embed.swing.InteropFactory;
+import com.sun.javafx.embed.swing.SwingDnD;
+import com.sun.javafx.embed.swing.SwingEvents;
+import com.sun.javafx.embed.swing.SwingCursors;
+import com.sun.javafx.embed.swing.SwingNodeHelper;
+import com.sun.javafx.embed.swing.JFXPanelInterop;
+
 /**
 * {@code JFXPanel} is a component to embed JavaFX content into
  * Swing applications. The content to be displayed is specified
  * with the {@link #setScene} method that accepts an instance of
  * JavaFX {@code Scene}. After the scene is assigned, it gets

@@ -183,10 +188,21 @@
 
     private boolean isCapturingMouse = false;
 
     private static boolean fxInitialized;
 
+    private static InteropFactory instance = null;
+    private JFXPanelInterop jfxPaneliop;
+
+    static {
+        try {
+            instance = InteropFactory.getInstance();
+        } catch (Exception e) {
+            throw new ExceptionInInitializerError(e);
+        }
+    }
+
     private synchronized void registerFinishListener() {
         if (instanceCount.getAndIncrement() > 0) {
             // Already registered
             return;
         }

@@ -254,10 +270,11 @@
      * preferred way to initialize JavaFX in Swing.
      */
     public JFXPanel() {
         super();
 
+        jfxPaneliop = instance.createJFXPanelImpl();
         initFx();
 
         hostContainer = new HostContainer();
 
         enableEvents(InputEvent.COMPONENT_EVENT_MASK |

@@ -448,14 +465,11 @@
                 // asynchronously handled so MOUSE_PRESSED event will not be
                 // honoured by FX immediately due to lack of focus in fx
                 // component. Fire the same MOUSE_PRESSED event after
                 // requestFocus() so that 2nd mouse press will be honoured
                 // since now fx have focus
-                AppContext context = SunToolkit.targetToAppContext(this);
-                if (context != null) {
-                    SunToolkit.postEvent(context, e);
-                }
+                jfxPaneliop.postEvent(this, e);
             }
         }
 
         sendMouseEventToFX(e);
         super.processMouseEvent(e);

@@ -568,15 +582,16 @@
             pHeight -= (i.top + i.bottom);
         }
         double newScaleFactorX = scaleFactorX;
         double newScaleFactorY = scaleFactorY;
         Graphics g = getGraphics();
-        if (g instanceof SunGraphics2D) {
-            SurfaceData sd = ((SunGraphics2D) g).surfaceData;
-            newScaleFactorX = sd.getDefaultScaleX();
-            newScaleFactorY = sd.getDefaultScaleY();
-        }
+        newScaleFactorX = GraphicsEnvironment.getLocalGraphicsEnvironment().
+                          getDefaultScreenDevice().getDefaultConfiguration().
+                          getDefaultTransform().getScaleX();
+        newScaleFactorY = GraphicsEnvironment.getLocalGraphicsEnvironment().
+                          getDefaultScreenDevice().getDefaultConfiguration().
+                          getDefaultTransform().getScaleY();
         if (oldWidth != pWidth || oldHeight != pHeight ||
             newScaleFactorX != scaleFactorX || newScaleFactorY != scaleFactorY)
         {
             createResizePixelBuffer(newScaleFactorX, newScaleFactorY);
             if (scenePeer != null) {

@@ -763,15 +778,16 @@
             }
             gg.drawImage(pixelsIm, 0, 0, pWidth, pHeight, null);
 
             double newScaleFactorX = scaleFactorX;
             double newScaleFactorY = scaleFactorY;
-            if (g instanceof SunGraphics2D) {
-                SurfaceData sd = ((SunGraphics2D)g).surfaceData;
-                newScaleFactorX = sd.getDefaultScaleX();
-                newScaleFactorY = sd.getDefaultScaleY();
-            }
+            newScaleFactorX = GraphicsEnvironment.getLocalGraphicsEnvironment().
+                              getDefaultScreenDevice().getDefaultConfiguration().
+                              getDefaultTransform().getScaleX();
+            newScaleFactorY = GraphicsEnvironment.getLocalGraphicsEnvironment().
+                              getDefaultScreenDevice().getDefaultConfiguration().
+                              getDefaultTransform().getScaleY();
             if (scaleFactorX != newScaleFactorX || scaleFactorY != newScaleFactorY) {
                 createResizePixelBuffer(newScaleFactorX, newScaleFactorY);
                 // The scene will request repaint.
                 scenePeer.setPixelScaleFactors((float) newScaleFactorX,
                                                (float) newScaleFactorY);

@@ -826,12 +842,12 @@
             }
         }
     }
 
     private transient  AWTEventListener ungrabListener = event -> {
-        if (event instanceof sun.awt.UngrabEvent) {
-            SwingFXUtils.runOnFxThread(() -> {
+        if (jfxPaneliop.isUngrabEvent(event)) {
+            SwingNodeHelper.runOnFxThread(() -> {
                 if (JFXPanel.this.stagePeer != null &&
                         getScene() != null &&
                         getScene().getFocusOwner() != null &&
                         getScene().getFocusOwner().isFocused()) {
                     JFXPanel.this.stagePeer.focusUngrab();

@@ -845,11 +861,11 @@
                 final Window jfxPanelWindow = SwingUtilities.getWindowAncestor(JFXPanel.this);
                 final Component source = (Component)event.getSource();
                 final Window eventWindow = source instanceof Window ? (Window)source : SwingUtilities.getWindowAncestor(source);
 
                 if (jfxPanelWindow == eventWindow) {
-                    SwingFXUtils.runOnFxThread(() -> {
+                    SwingNodeHelper.runOnFxThread(() -> {
                         if (JFXPanel.this.stagePeer != null) {
                             // No need to check if grab is active or not.
                             // NoAutoHide popups don't request the grab and
                             // ignore the Ungrab event anyway.
                             // AutoHide popups actually should be hidden when

@@ -875,15 +891,15 @@
 
         registerFinishListener();
 
         AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
             JFXPanel.this.getToolkit().addAWTEventListener(ungrabListener,
-                SunToolkit.GRAB_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK);
+            jfxPaneliop.setMask());
             return null;
         });
         updateComponentSize(); // see RT-23603
-        SwingFXUtils.runOnFxThread(() -> {
+        SwingNodeHelper.runOnFxThread(() -> {
             if ((stage != null) && !stage.isShowing()) {
                 stage.show();
                 sendMoveEventToFX();
             }
         });

@@ -902,11 +918,11 @@
      * Notifies this component that it no longer has a parent component.
      * When this method is invoked, any KeyboardActions set up in the the
      * chain of parent components are removed.
      */
     @Override public void removeNotify() {
-        SwingFXUtils.runOnFxThread(() -> {
+        SwingNodeHelper.runOnFxThread(() -> {
             if ((stage != null) && stage.isShowing()) {
                 stage.hide();
             }
         });
 

@@ -926,16 +942,11 @@
 
         deregisterFinishListener();
     }
 
     private void invokeOnClientEDT(Runnable r) {
-        AppContext context = SunToolkit.targetToAppContext(this);
-        if (context == null) {
-            if (log.isLoggable(Level.FINE)) log.fine("null AppContext encountered!");
-            return;
-        }
-        SunToolkit.postEvent(context, new InvocationEvent(this, r));
+        jfxPaneliop.postEvent(this, new InvocationEvent(this, r));
     }
 
     private class HostContainer implements HostInterface {
 
         @Override

@@ -1052,13 +1063,11 @@
             if (PlatformUtil.isLinux()) return true;
 
             invokeOnClientEDT(() -> {
                 Window window = SwingUtilities.getWindowAncestor(JFXPanel.this);
                 if (window != null) {
-                    if (JFXPanel.this.getToolkit() instanceof SunToolkit) {
-                        ((SunToolkit)JFXPanel.this.getToolkit()).grab(window);
-                    }
+                    jfxPaneliop.grab(JFXPanel.this.getToolkit(), window);
                 }
             });
 
             return true; // Oh, well...
         }

@@ -1070,13 +1079,11 @@
             if (PlatformUtil.isLinux()) return;
 
             invokeOnClientEDT(() -> {
                 Window window = SwingUtilities.getWindowAncestor(JFXPanel.this);
                 if (window != null) {
-                    if (JFXPanel.this.getToolkit() instanceof SunToolkit) {
-                        ((SunToolkit)JFXPanel.this.getToolkit()).ungrab(window);
-                    }
+                    jfxPaneliop.ungrab(JFXPanel.this.getToolkit(), window);
                 }
             });
         }
     }
 }
< prev index next >