< prev index next >

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

Print this page

        

@@ -51,11 +51,10 @@
 import java.awt.dnd.DragGestureListener;
 import java.awt.dnd.DragGestureRecognizer;
 import java.awt.dnd.DragSource;
 import java.awt.dnd.DropTarget;
 import java.awt.dnd.InvalidDnDOperationException;
-import java.awt.dnd.peer.DragSourceContextPeer;
 import java.awt.event.InputEvent;
 import java.awt.event.MouseWheelEvent;
 import java.awt.event.WindowEvent;
 import java.awt.event.WindowFocusListener;
 import java.lang.reflect.Method;

@@ -78,16 +77,18 @@
 import com.sun.javafx.stage.WindowHelper;
 import com.sun.javafx.tk.TKStage;
 import com.sun.javafx.PlatformUtil;
 import com.sun.javafx.embed.swing.SwingNodeHelper;
 import com.sun.javafx.scene.NodeHelper;
-import sun.awt.UngrabEvent;
-import sun.swing.JLightweightFrame;
-import sun.swing.LightweightContent;
 
+import com.sun.javafx.embed.swing.SwingEvents;
+import com.sun.javafx.embed.swing.SwingCursors;
 import static javafx.stage.WindowEvent.WINDOW_HIDDEN;
 
+import com.sun.javafx.embed.swing.InteropFactory;
+import com.sun.javafx.embed.swing.SwingNodeInterop;
+
 /**
  * This class is used to embed a Swing content into a JavaFX application.
  * The content to be displayed is specified with the {@link #setContent} method
  * that accepts an instance of Swing {@code JComponent}. The hierarchy of components
  * contained in the {@code JComponent} instance should not contain any heavyweight

@@ -127,20 +128,30 @@
  * </pre>
  * @since JavaFX 8.0
  */
 public class SwingNode extends Node {
     private static boolean isThreadMerged;
+    private static SwingNodeInterop swiop;
 
     static {
+        InteropFactory instance = null;
+    try {
+        instance = InteropFactory.getInstance();
+    } catch (Exception e) {
+            throw new ExceptionInInitializerError(e);
+    }
+    swiop = instance.createSwingNodeImpl();
+
         AccessController.doPrivileged(new PrivilegedAction<Object>() {
             public Object run() {
                 isThreadMerged = Boolean.valueOf(
                         System.getProperty("javafx.embed.singleThread"));
                 return null;
             }
         });
 
+
          // This is used by classes in different packages to get access to
          // private and package private methods.
         SwingNodeHelper.setSwingNodeAccessor(new SwingNodeHelper.SwingNodeAccessor() {
             @Override
             public NGNode doCreatePeer(Node node) {

@@ -166,28 +177,27 @@
     }
 
     private double fxWidth;
     private double fxHeight;
 
-    private int swingPrefWidth;
-    private int swingPrefHeight;
-    private int swingMaxWidth;
-    private int swingMaxHeight;
-    private int swingMinWidth;
-    private int swingMinHeight;
+    public int swingPrefWidth;
+    public int swingPrefHeight;
+    public int swingMaxWidth;
+    public int swingMaxHeight;
+    public int swingMinWidth;
+    public int swingMinHeight;
 
     private volatile JComponent content;
-    private volatile JLightweightFrame lwFrame;
-    final JLightweightFrame getLightweightFrame() { return lwFrame; }
+    private volatile Object lwFrame;
+    public final Object getLightweightFrame() { return lwFrame; }
 
     private NGExternalNode peer;
 
-    private final ReentrantLock paintLock = new ReentrantLock();
+    public final ReentrantLock paintLock = new ReentrantLock();
 
     private boolean skipBackwardUnrgabNotification;
-    private boolean grabbed; // lwframe initiated grab
-    private Timer deactivate; // lwFrame deactivate delay for Linux
+    public boolean grabbed; // lwframe initiated grab
 
     {
         // To initialize the class helper at the begining each constructor of this class
         SwingNodeHelper.initHelper(this);
     }

@@ -200,11 +210,11 @@
         setEventHandler(MouseEvent.ANY, new SwingMouseEventHandler());
         setEventHandler(KeyEvent.ANY, new SwingKeyEventHandler());
         setEventHandler(ScrollEvent.SCROLL, new SwingScrollEventHandler());
 
         focusedProperty().addListener((observable, oldValue, newValue) -> {
-             activateLwFrame(newValue);
+             swiop.activateLwFrame(lwFrame, newValue);
         });
 
         //Workaround for RT-34170
         javafx.scene.text.Font.getFamilies();
     }

@@ -214,17 +224,17 @@
         if (lwFrame != null &&  event.getTarget() instanceof Window) {
             final Window w = (Window) event.getTarget();
             TKStage tk = WindowHelper.getPeer(w);
             if (tk != null) {
                 if (isThreadMerged) {
-                    jlfOverrideNativeWindowHandle.invoke(lwFrame, 0L, null);
+            swiop.overrideNativeWindowHandle(0L, null);
                 } else {
                     // Postpone actual window closing to ensure that
                     // a native window handler is valid on a Swing side
                     tk.postponeClose();
                     SwingFXUtils.runOnEDT(() -> {
-                        jlfOverrideNativeWindowHandle.invoke(lwFrame, 0L,
+            swiop.overrideNativeWindowHandle(0L,
                                 (Runnable) () -> SwingFXUtils.runOnFxThread(
                                         () -> tk.closePostponed()));
                     });
                 }
             }

@@ -250,11 +260,11 @@
                 TKStage tkStage = WindowHelper.getPeer(window);
                 if (tkStage != null) {
                     rawHandle = tkStage.getRawHandle();
                 }
             }
-            jlfOverrideNativeWindowHandle.invoke(lwFrame, rawHandle, null);
+            swiop.overrideNativeWindowHandle(rawHandle, null);
         }
     }
 
     /**
      * Attaches a {@code JComponent} instance to display in this {@code SwingNode}.

@@ -328,84 +338,56 @@
                 return null;
             }
         }
     }
 
-    /**
-     * Calls JLightweightFrame.notifyDisplayChanged.
-     * Must be called on EDT only.
-     */
-    private static OptionalMethod<JLightweightFrame> jlfNotifyDisplayChanged;
-    private static OptionalMethod<JLightweightFrame> jlfOverrideNativeWindowHandle;
-
-    static {
-        jlfNotifyDisplayChanged = new OptionalMethod<>(JLightweightFrame.class,
-                "notifyDisplayChanged", Double.TYPE, Double.TYPE);
-        if (!jlfNotifyDisplayChanged.isSupported()) {
-            jlfNotifyDisplayChanged = new OptionalMethod<>(
-                  JLightweightFrame.class,"notifyDisplayChanged", Integer.TYPE);
-        }
-
-        jlfOverrideNativeWindowHandle = new OptionalMethod<>(JLightweightFrame.class,
-                "overrideNativeWindowHandle", Long.TYPE, Runnable.class);
-
-    }
-
     /*
      * Called on EDT
      */
     private void setContentImpl(JComponent content) {
         if (lwFrame != null) {
-            lwFrame.dispose();
+            swiop.disposeLwFrame();
             lwFrame = null;
         }
         if (content != null) {
-            lwFrame = new JLightweightFrame();
+            lwFrame = swiop.createLightweightFrame();
 
             SwingNodeWindowFocusListener snfListener =
                                  new SwingNodeWindowFocusListener(this);
-            lwFrame.addWindowFocusListener(snfListener);
+            swiop.addWindowFocusListener(lwFrame, snfListener);
 
             if (getScene() != null) {
                 Window window = getScene().getWindow();
                 if (window != null) {
-                    if (jlfNotifyDisplayChanged.isIntegerApi()) {
-                        jlfNotifyDisplayChanged.invoke(lwFrame,
-                                (int) Math.round(window.getRenderScaleX()));
-                    } else {
-                        jlfNotifyDisplayChanged.invoke(lwFrame,
-                                window.getRenderScaleX(),
-                                window.getRenderScaleY());
+            swiop.notifyDisplayChanged(lwFrame, window);
                     }
                 }
-            }
-            lwFrame.setContent(new SwingNodeContent(content, this));
-            lwFrame.setVisible(true);
+            swiop.setContent(lwFrame, swiop.createSwingNodeContent(content, this));
+            swiop.setVisible(lwFrame, true);
 
-            SwingNodeDisposer disposeRec = new SwingNodeDisposer(lwFrame);
-            Disposer.addRecord(this, disposeRec);
+            Disposer.addRecord(this, swiop.createSwingNodeDisposer(lwFrame));
 
             if (getScene() != null) {
                 notifyNativeHandle(getScene().getWindow());
             }
 
             SwingFXUtils.runOnFxThread(() -> {
-                locateLwFrame(); // initialize location
+                locateLwFrame();// initialize location
 
                 if (focusedProperty().get()) {
-                    activateLwFrame(true);
+                    swiop.activateLwFrame(lwFrame, true);
                 }
             });
         }
     }
 
     private List<Runnable> peerRequests = new ArrayList<>();
 
     /*
      * Called on EDT
      */
-    void setImageBuffer(final int[] data,
+    public void setImageBuffer(final int[] data,
                         final int x, final int y,
                         final int w, final int h,
                         final int linestride,
                         final double scaleX,
                         final double scaleY)

@@ -423,11 +405,11 @@
     }
 
     /*
      * Called on EDT
      */
-    void setImageBounds(final int x, final int y, final int w, final int h) {
+    public void setImageBounds(final int x, final int y, final int w, final int h) {
         Runnable r = () -> peer.setImageBounds(x, y, w, h, w, h);
         SwingFXUtils.runOnFxThread(() -> {
             if (peer != null) {
                 r.run();
             } else {

@@ -437,11 +419,11 @@
     }
 
     /*
      * Called on EDT
      */
-    void repaintDirtyRegion(final int dirtyX, final int dirtyY, final int dirtyWidth, final int dirtyHeight) {
+    public void repaintDirtyRegion(final int dirtyX, final int dirtyY, final int dirtyWidth, final int dirtyHeight) {
         Runnable r = () -> {
             peer.repaintDirtyRegion(dirtyX, dirtyY, dirtyWidth, dirtyHeight);
             NodeHelper.markDirty(this, DirtyBits.NODE_CONTENTS);
         };
         SwingFXUtils.runOnFxThread(() -> {

@@ -557,18 +539,19 @@
     };
 
     private final EventHandler<FocusUngrabEvent> ungrabHandler = event -> {
         if (!skipBackwardUnrgabNotification) {
             if (lwFrame != null) {
-                AccessController.doPrivileged(new PostEventAction(new UngrabEvent(lwFrame)));
+                AccessController.doPrivileged(new PostEventAction(
+                    swiop.createUngrabEvent(lwFrame)));
             }
         }
     };
 
     private final ChangeListener<Boolean> windowVisibleListener = (observable, oldValue, newValue) -> {
         if (!newValue) {
-            disposeLwFrame();
+            swiop.disposeLwFrame();
         } else {
             setContent(content);
         }
     };
 

@@ -607,11 +590,11 @@
         window.widthProperty().addListener(locationListener);
         window.heightProperty().addListener(locationListener);
         window.renderScaleXProperty().addListener(locationListener);
         window.addEventHandler(FocusUngrabEvent.FOCUS_UNGRAB, ungrabHandler);
         window.showingProperty().addListener(windowVisibleListener);
-        setLwFrameScale(window.getRenderScaleX(), window.getRenderScaleY());
+        swiop.setLwFrameScale(window.getRenderScaleX(), window.getRenderScaleY());
     }
 
     private void removeWindowListeners(final Window window) {
         window.xProperty().removeListener(locationListener);
         window.yProperty().removeListener(locationListener);

@@ -639,11 +622,11 @@
 
         sceneProperty().addListener((observable, oldValue, newValue) -> {
             if (oldValue != null) {
                 // Removed from scene
                 removeSceneListeners(oldValue);
-                disposeLwFrame();
+                swiop.disposeLwFrame();
             }
             if (newValue != null) {
                 // Added to another scene
                 if (content != null && lwFrame == null) {
                     setContent(content);

@@ -651,11 +634,11 @@
                 addSceneListeners(newValue);
             }
         });
 
         NodeHelper.treeVisibleProperty(this).addListener((observable, oldValue, newValue) -> {
-            setLwFrameVisible(newValue);
+            swiop.setLwFrameVisible(newValue);
         });
 
         return peer;
     }
 

@@ -670,18 +653,10 @@
         if (NodeHelper.isDirty(this, DirtyBits.NODE_CONTENTS)) {
             peer.markContentDirty();
         }
     }
 
-    /**
-     * Calls JLightweightFrame.setHostBounds.
-     * Must be called on EDT only.
-     */
-    private static final OptionalMethod<JLightweightFrame> jlfSetHostBounds =
-        new OptionalMethod<>(JLightweightFrame.class, "setHostBounds",
-                Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE);
-
     private void locateLwFrame() {
         if (getScene() == null
                 || lwFrame == null
                 || getScene().getWindow() == null
                 || !getScene().getWindow().isShowing()) {

@@ -701,90 +676,13 @@
         final int frameW = (int) (fxWidth);
         final int frameH = (int) (fxHeight);
 
         SwingFXUtils.runOnEDT(() -> {
             if (lwFrame != null) {
-                if (jlfNotifyDisplayChanged.isIntegerApi()) {
-                    jlfNotifyDisplayChanged.invoke(lwFrame,
-                            (int)Math.round(renderScaleX));
-                } else {
-                    jlfNotifyDisplayChanged.invoke(lwFrame, renderScaleX,
-                                                                  renderScaleY);
-                }
-                lwFrame.setBounds(frameX, frameY, frameW, frameH);
-                jlfSetHostBounds.invoke(lwFrame, windowX, windowY,
-                    windowW, windowH);
-            }
-        });
-    }
-
-    private void activateLwFrame(final boolean activate) {
-        if (lwFrame == null) {
-            return;
-        }
-        if (PlatformUtil.isLinux()) {
-            // Workaround to block FocusOut/FocusIn notifications from Unity
-            // focus grabbing upon Alt press
-            if (deactivate == null || !deactivate.isRunning()) {
-                if (!activate) {
-                    deactivate = new Timer(50, (e) -> {
-                        {
-                            if (lwFrame != null) {
-                                lwFrame.emulateActivation(false);
-                            }
-                        }
-                    });
-                    deactivate.start();
-                    return;
-                }
-            } else {
-                deactivate.stop();
-            }
-        }
-
-        SwingFXUtils.runOnEDT(() -> {
-            if (lwFrame != null) {
-                lwFrame.emulateActivation(activate);
-            }
-        });
-    }
-
-    private void disposeLwFrame() {
-        if (lwFrame == null) {
-            return;
-        }
-        SwingFXUtils.runOnEDT(() -> {
-            if (lwFrame != null) {
-                lwFrame.dispose();
-                lwFrame = null;
-            }
-        });
-    }
-
-    private void setLwFrameVisible(final boolean visible) {
-        if (lwFrame == null) {
-            return;
-        }
-        SwingFXUtils.runOnEDT(() -> {
-            if (lwFrame != null) {
-                lwFrame.setVisible(visible);
-            }
-        });
-    }
-
-    private void setLwFrameScale(final double scaleX, final double scaleY) {
-        if (lwFrame == null) {
-            return;
-        }
-        SwingFXUtils.runOnEDT(() -> {
-            if (lwFrame != null) {
-                if (jlfNotifyDisplayChanged.isIntegerApi()) {
-                    jlfNotifyDisplayChanged.invoke(lwFrame,
-                                                       (int)Math.round(scaleX));
-                } else {
-                    jlfNotifyDisplayChanged.invoke(lwFrame, scaleX, scaleY);
-                }
+        swiop.notifyDisplayChanged(lwFrame, w);
+        swiop.setBounds(lwFrame, frameX, frameY, frameW, frameH);
+        swiop.setHostBounds(lwFrame, w);
             }
         });
     }
 
     /*

@@ -794,23 +692,10 @@
         bounds.deriveWithNewBounds(0, 0, 0, (float)fxWidth, (float)fxHeight, 0);
         tx.transform(bounds, bounds);
         return bounds;
     }
 
-    private static class SwingNodeDisposer implements DisposerRecord {
-         JLightweightFrame lwFrame;
-
-         SwingNodeDisposer(JLightweightFrame ref) {
-             this.lwFrame = ref;
-         }
-         public void dispose() {
-             if (lwFrame != null) {
-                 lwFrame.dispose();
-                 lwFrame = null;
-             }
-         }
-    }
 
     private static class SwingNodeWindowFocusListener implements WindowFocusListener {
         private WeakReference<SwingNode> swingNodeRef;
 
         SwingNodeWindowFocusListener(SwingNode swingNode) {

@@ -836,187 +721,11 @@
                 }
             });
         }
     }
 
-    private static class SwingNodeContent implements LightweightContent {
-        private JComponent comp;
-        private volatile FXDnD dnd;
-        private WeakReference<SwingNode> swingNodeRef;
-
-        SwingNodeContent(JComponent comp, SwingNode swingNode) {
-            this.comp = comp;
-            this.swingNodeRef = new WeakReference<SwingNode>(swingNode);
-        }
-        @Override
-        public JComponent getComponent() {
-            return comp;
-        }
-        @Override
-        public void paintLock() {
-            SwingNode swingNode = swingNodeRef.get();
-            if (swingNode != null) {
-                swingNode.paintLock.lock();
-            }
-        }
-        @Override
-        public void paintUnlock() {
-            SwingNode swingNode = swingNodeRef.get();
-            if (swingNode != null) {
-                swingNode.paintLock.unlock();
-            }
-        }
-
-        // Note: we skip @Override annotation and implement both pre-hiDPI and post-hiDPI versions
-        // of the method for compatibility.
-        //@Override
-        public void imageBufferReset(int[] data, int x, int y, int width, int height, int linestride) {
-            imageBufferReset(data, x, y, width, height, linestride, 1);
-        }
-        //@Override
-        public void imageBufferReset(int[] data, int x, int y, int width, int height, int linestride, int scale) {
-            SwingNode swingNode = swingNodeRef.get();
-            if (swingNode != null) {
-                swingNode.setImageBuffer(data, x, y, width, height, linestride, scale, scale);
-            }
-        }
-        //@Override
-        public void imageBufferReset(int[] data, int x, int y, int width, int height, int linestride, double scaleX, double scaleY) {
-            SwingNode swingNode = swingNodeRef.get();
-            if (swingNode != null) {
-                swingNode.setImageBuffer(data, x, y, width, height, linestride, scaleX, scaleY);
-            }
-        }
-        @Override
-        public void imageReshaped(int x, int y, int width, int height) {
-            SwingNode swingNode = swingNodeRef.get();
-            if (swingNode != null) {
-                swingNode.setImageBounds(x, y, width, height);
-            }
-        }
-        @Override
-        public void imageUpdated(int dirtyX, int dirtyY, int dirtyWidth, int dirtyHeight) {
-            SwingNode swingNode = swingNodeRef.get();
-            if (swingNode != null) {
-                swingNode.repaintDirtyRegion(dirtyX, dirtyY, dirtyWidth, dirtyHeight);
-            }
-        }
-        @Override
-        public void focusGrabbed() {
-            SwingFXUtils.runOnFxThread(() -> {
-                // On X11 grab is limited to a single XDisplay connection,
-                // so we can't delegate it to another GUI toolkit.
-                if (PlatformUtil.isLinux()) return;
-
-                SwingNode swingNode = swingNodeRef.get();
-                if (swingNode != null) {
-                    Scene scene = swingNode.getScene();
-                    if (scene != null &&
-                            scene.getWindow() != null &&
-                            WindowHelper.getPeer(scene.getWindow()) != null) {
-                        WindowHelper.getPeer(scene.getWindow()).grabFocus();
-                        swingNode.grabbed = true;
-                    }
-                }
-            });
-        }
-        @Override
-        public void focusUngrabbed() {
-            SwingFXUtils.runOnFxThread(() -> {
-                SwingNode swingNode = swingNodeRef.get();
-                if (swingNode != null) {
-                    swingNode.ungrabFocus(false);
-                }
-            });
-        }
-        @Override
-        public void preferredSizeChanged(final int width, final int height) {
-            SwingFXUtils.runOnFxThread(() -> {
-                SwingNode swingNode = swingNodeRef.get();
-                if (swingNode != null) {
-                    swingNode.swingPrefWidth = width;
-                    swingNode.swingPrefHeight = height;
-                    NodeHelper.notifyLayoutBoundsChanged(swingNode);
-                }
-            });
-        }
-        @Override
-        public void maximumSizeChanged(final int width, final int height) {
-            SwingFXUtils.runOnFxThread(() -> {
-                SwingNode swingNode = swingNodeRef.get();
-                if (swingNode != null) {
-                    swingNode.swingMaxWidth = width;
-                    swingNode.swingMaxHeight = height;
-                    NodeHelper.notifyLayoutBoundsChanged(swingNode);
-                }
-            });
-        }
-        @Override
-        public void minimumSizeChanged(final int width, final int height) {
-            SwingFXUtils.runOnFxThread(() -> {
-                SwingNode swingNode = swingNodeRef.get();
-                if (swingNode != null) {
-                    swingNode.swingMinWidth = width;
-                    swingNode.swingMinHeight = height;
-                    NodeHelper.notifyLayoutBoundsChanged(swingNode);
-                }
-            });
-        }
-
-        //@Override
-        public void setCursor(Cursor cursor) {
-            SwingFXUtils.runOnFxThread(() -> {
-                SwingNode swingNode = swingNodeRef.get();
-                if (swingNode != null) {
-                    swingNode.setCursor(SwingCursors.embedCursorToCursor(cursor));
-                }
-            });
-        }
-
-        private void initDnD() {
-            // This is a part of AWT API, so the method may be invoked on any thread
-            synchronized (SwingNodeContent.this) {
-                if (this.dnd == null) {
-                    SwingNode swingNode = swingNodeRef.get();
-                    if (swingNode != null) {
-                        this.dnd = new FXDnD(swingNode);
-                    }
-                }
-            }
-        }
-
-        //@Override
-        public synchronized <T extends DragGestureRecognizer> T createDragGestureRecognizer(
-                Class<T> abstractRecognizerClass,
-                DragSource ds, Component c, int srcActions,
-                DragGestureListener dgl)
-        {
-            initDnD();
-            return dnd.createDragGestureRecognizer(abstractRecognizerClass, ds, c, srcActions, dgl);
-        }
-
-        //@Override
-        public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException
-        {
-            initDnD();
-            return dnd.createDragSourceContextPeer(dge);
-        }
-
-        //@Override
-        public void addDropTarget(DropTarget dt) {
-            initDnD();
-            dnd.addDropTarget(dt);
-        }
-
-        //@Override
-        public void removeDropTarget(DropTarget dt) {
-            initDnD();
-            dnd.removeDropTarget(dt);
-        }
-    }
-
-    private void ungrabFocus(boolean postUngrabEvent) {
+    public void ungrabFocus(boolean postUngrabEvent) {
         // On X11 grab is limited to a single XDisplay connection,
         // so we can't delegate it to another GUI toolkit.
         if (PlatformUtil.isLinux()) return;
 
         if (grabbed &&

@@ -1047,11 +756,11 @@
     private class SwingMouseEventHandler implements EventHandler<MouseEvent> {
         private final Set<MouseButton> mouseClickedAllowed = new HashSet<>();
 
         @Override
         public void handle(MouseEvent event) {
-            JLightweightFrame frame = lwFrame;
+        Object frame = swiop.getLightweightFrame();
             if (frame == null) {
                 return;
             }
             int swingID = SwingEvents.fxMouseEventTypeToMouseID(event);
             if (swingID < 0) {

@@ -1085,22 +794,22 @@
             int relX = (int) Math.round(event.getX());
             int relY = (int) Math.round(event.getY());
             int absX = (int) Math.round(event.getScreenX());
             int absY = (int) Math.round(event.getScreenY());
             java.awt.event.MouseEvent mouseEvent =
-                    new java.awt.event.MouseEvent(
+                    swiop.createMouseEvent(
                         frame, swingID, swingWhen, swingModifiers,
                         relX, relY, absX, absY,
                         event.getClickCount(), swingPopupTrigger, swingButton);
             AccessController.doPrivileged(new PostEventAction(mouseEvent));
         }
     }
 
     private class SwingScrollEventHandler implements EventHandler<ScrollEvent> {
         @Override
         public void handle(ScrollEvent event) {
-            JLightweightFrame frame = lwFrame;
+        Object frame = swiop.getLightweightFrame();
             if (frame == null) {
                 return;
             }
 
             int swingModifiers = SwingEvents.fxScrollModsToMouseWheelMods(event);

@@ -1120,30 +829,28 @@
                 sendMouseWheelEvent(frame, event.getX(), event.getY(),
                         swingModifiers, delta);
             }
         }
 
-        private void sendMouseWheelEvent(Component source, double fxX, double fxY, int swingModifiers, double delta) {
+        private void sendMouseWheelEvent(Object source, double fxX, double fxY, int swingModifiers, double delta) {
             int wheelRotation = (int) delta;
             int signum = (int) Math.signum(delta);
             if (signum * delta < 1) {
                 wheelRotation = signum;
             }
             int x = (int) Math.round(fxX);
             int y = (int) Math.round(fxY);
             MouseWheelEvent mouseWheelEvent =
-                    new MouseWheelEvent(source, java.awt.event.MouseEvent.MOUSE_WHEEL,
-                            System.currentTimeMillis(), swingModifiers, x, y, 0, 0,
-                            0, false, MouseWheelEvent.WHEEL_UNIT_SCROLL, 1 , -wheelRotation);
+                swiop.createMouseWheelEvent(source, swingModifiers, x, y, -wheelRotation);
             AccessController.doPrivileged(new PostEventAction(mouseWheelEvent));
         }
     }
 
     private class SwingKeyEventHandler implements EventHandler<KeyEvent> {
         @Override
         public void handle(KeyEvent event) {
-            JLightweightFrame frame = lwFrame;
+        Object frame = swiop.getLightweightFrame();
             if (frame == null) {
                 return;
             }
             if (event.getCharacter().isEmpty()) {
                 // TODO: should we post an "empty" character?

@@ -1174,12 +881,13 @@
                 if (text.length() == 1) {
                     swingChar = text.charAt(0);
                 }
             }
             long swingWhen = System.currentTimeMillis();
-            java.awt.event.KeyEvent keyEvent = new java.awt.event.KeyEvent(
-                    frame, swingID, swingWhen, swingModifiers,
-                    swingKeyCode, swingChar);
+            java.awt.event.KeyEvent keyEvent = swiop.createKeyEvent(frame,
+                swingID, swingWhen, swingModifiers, swingKeyCode,
+                swingChar);
             AccessController.doPrivileged(new PostEventAction(keyEvent));
         }
     }
 }
+
< prev index next >