< prev index next >

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

Print this page

        

*** 51,61 **** 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; --- 51,60 ----
*** 78,90 **** 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 static javafx.stage.WindowEvent.WINDOW_HIDDEN; /** * This class is used to embed a Swing content into a JavaFX application. --- 77,92 ---- 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 com.sun.javafx.util.Utils; ! ! import jdk.swing.interop.LightweightFrameWrapper; ! import jdk.swing.interop.LightweightContentWrapper; ! import jdk.swing.interop.DragSourceContextWrapper; import static javafx.stage.WindowEvent.WINDOW_HIDDEN; /** * This class is used to embed a Swing content into a JavaFX application.
*** 174,185 **** private int swingMaxHeight; private int swingMinWidth; private int swingMinHeight; private volatile JComponent content; ! private volatile JLightweightFrame lwFrame; ! final JLightweightFrame getLightweightFrame() { return lwFrame; } private NGExternalNode peer; private final ReentrantLock paintLock = new ReentrantLock(); --- 176,187 ---- private int swingMaxHeight; private int swingMinWidth; private int swingMinHeight; private volatile JComponent content; ! private volatile LightweightFrameWrapper lwFrame; ! final LightweightFrameWrapper getLightweightFrame() { return lwFrame; } private NGExternalNode peer; private final ReentrantLock paintLock = new ReentrantLock();
*** 214,230 **** 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); } 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, (Runnable) () -> SwingFXUtils.runOnFxThread( () -> tk.closePostponed())); }); } } --- 216,232 ---- if (lwFrame != null && event.getTarget() instanceof Window) { final Window w = (Window) event.getTarget(); TKStage tk = WindowHelper.getPeer(w); if (tk != null) { if (isThreadMerged) { ! overrideNativeWindowHandle(lwFrameWrapperClass, 0L, null); } else { // Postpone actual window closing to ensure that // a native window handler is valid on a Swing side tk.postponeClose(); SwingFXUtils.runOnEDT(() -> { ! overrideNativeWindowHandle(lwFrameWrapperClass, 0L, (Runnable) () -> SwingFXUtils.runOnFxThread( () -> tk.closePostponed())); }); } }
*** 250,260 **** TKStage tkStage = WindowHelper.getPeer(window); if (tkStage != null) { rawHandle = tkStage.getRawHandle(); } } ! jlfOverrideNativeWindowHandle.invoke(lwFrame, rawHandle, null); } } /** * Attaches a {@code JComponent} instance to display in this {@code SwingNode}. --- 252,262 ---- TKStage tkStage = WindowHelper.getPeer(window); if (tkStage != null) { rawHandle = tkStage.getRawHandle(); } } ! overrideNativeWindowHandle(lwFrameWrapperClass, rawHandle, null); } } /** * Attaches a {@code JComponent} instance to display in this {@code SwingNode}.
*** 329,355 **** } } } /** ! * 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 */ --- 331,361 ---- } } } /** ! * Calls LightweightFrameWrapper.notifyDisplayChanged. * Must be called on EDT only. */ ! private static OptionalMethod<LightweightFrameWrapper> jlfNotifyDisplayChanged; ! private static Class lwFrameWrapperClass = null; ! private static native void overrideNativeWindowHandle(Class lwFrameWrapperClass, long handle, ! Runnable closeWindow); static { ! jlfNotifyDisplayChanged = new OptionalMethod<>(LightweightFrameWrapper.class, "notifyDisplayChanged", Double.TYPE, Double.TYPE); if (!jlfNotifyDisplayChanged.isSupported()) { jlfNotifyDisplayChanged = new OptionalMethod<>( ! LightweightFrameWrapper.class,"notifyDisplayChanged", Integer.TYPE); } ! try { ! lwFrameWrapperClass = Class.forName("jdk.swing.interop.LightweightFrameWrapper"); ! } catch (Throwable t) {} + Utils.loadNativeSwingLibrary(); } /* * Called on EDT */
*** 357,367 **** if (lwFrame != null) { lwFrame.dispose(); lwFrame = null; } if (content != null) { ! lwFrame = new JLightweightFrame(); SwingNodeWindowFocusListener snfListener = new SwingNodeWindowFocusListener(this); lwFrame.addWindowFocusListener(snfListener); --- 363,373 ---- if (lwFrame != null) { lwFrame.dispose(); lwFrame = null; } if (content != null) { ! lwFrame = new LightweightFrameWrapper(); SwingNodeWindowFocusListener snfListener = new SwingNodeWindowFocusListener(this); lwFrame.addWindowFocusListener(snfListener);
*** 557,567 **** }; private final EventHandler<FocusUngrabEvent> ungrabHandler = event -> { if (!skipBackwardUnrgabNotification) { if (lwFrame != null) { ! AccessController.doPrivileged(new PostEventAction(new UngrabEvent(lwFrame))); } } }; private final ChangeListener<Boolean> windowVisibleListener = (observable, oldValue, newValue) -> { --- 563,574 ---- }; private final EventHandler<FocusUngrabEvent> ungrabHandler = event -> { if (!skipBackwardUnrgabNotification) { if (lwFrame != null) { ! AccessController.doPrivileged(new PostEventAction( ! lwFrame.createUngrabEvent(lwFrame))); } } }; private final ChangeListener<Boolean> windowVisibleListener = (observable, oldValue, newValue) -> {
*** 671,685 **** 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 --- 678,692 ---- peer.markContentDirty(); } } /** ! * Calls LightweightFrameWrapper.setHostBounds. * Must be called on EDT only. */ ! private static final OptionalMethod<LightweightFrameWrapper> jlfSetHostBounds = ! new OptionalMethod<>(LightweightFrameWrapper.class, "setHostBounds", Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE); private void locateLwFrame() { if (getScene() == null || lwFrame == null
*** 795,807 **** 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(); --- 802,814 ---- tx.transform(bounds, bounds); return bounds; } private static class SwingNodeDisposer implements DisposerRecord { ! LightweightFrameWrapper lwFrame; ! SwingNodeDisposer(LightweightFrameWrapper ref) { this.lwFrame = ref; } public void dispose() { if (lwFrame != null) { lwFrame.dispose();
*** 836,846 **** } }); } } ! private static class SwingNodeContent implements LightweightContent { private JComponent comp; private volatile FXDnD dnd; private WeakReference<SwingNode> swingNodeRef; SwingNodeContent(JComponent comp, SwingNode swingNode) { --- 843,853 ---- } }); } } ! private static class SwingNodeContent extends LightweightContentWrapper { private JComponent comp; private volatile FXDnD dnd; private WeakReference<SwingNode> swingNodeRef; SwingNodeContent(JComponent comp, SwingNode swingNode) {
*** 864,887 **** 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); } --- 871,892 ---- if (swingNode != null) { swingNode.paintLock.unlock(); } } ! @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); }
*** 982,1015 **** } } } } ! //@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); } } --- 987,1020 ---- } } } } ! @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 DragSourceContextWrapper createDragSourceContext(DragGestureEvent dge) throws InvalidDnDOperationException { initDnD(); ! return dnd.createDragSourceContext(dge); } ! @Override public void addDropTarget(DropTarget dt) { initDnD(); dnd.addDropTarget(dt); } ! @Override public void removeDropTarget(DropTarget dt) { initDnD(); dnd.removeDropTarget(dt); } }
*** 1047,1057 **** private class SwingMouseEventHandler implements EventHandler<MouseEvent> { private final Set<MouseButton> mouseClickedAllowed = new HashSet<>(); @Override public void handle(MouseEvent event) { ! JLightweightFrame frame = lwFrame; if (frame == null) { return; } int swingID = SwingEvents.fxMouseEventTypeToMouseID(event); if (swingID < 0) { --- 1052,1062 ---- private class SwingMouseEventHandler implements EventHandler<MouseEvent> { private final Set<MouseButton> mouseClickedAllowed = new HashSet<>(); @Override public void handle(MouseEvent event) { ! LightweightFrameWrapper frame = lwFrame; if (frame == null) { return; } int swingID = SwingEvents.fxMouseEventTypeToMouseID(event); if (swingID < 0) {
*** 1085,1106 **** 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( 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; if (frame == null) { return; } int swingModifiers = SwingEvents.fxScrollModsToMouseWheelMods(event); --- 1090,1111 ---- 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 = ! frame.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) { ! LightweightFrameWrapper frame = lwFrame; if (frame == null) { return; } int swingModifiers = SwingEvents.fxScrollModsToMouseWheelMods(event);
*** 1120,1149 **** sendMouseWheelEvent(frame, event.getX(), event.getY(), swingModifiers, delta); } } ! private void sendMouseWheelEvent(Component 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); AccessController.doPrivileged(new PostEventAction(mouseWheelEvent)); } } private class SwingKeyEventHandler implements EventHandler<KeyEvent> { @Override public void handle(KeyEvent event) { ! JLightweightFrame frame = lwFrame; if (frame == null) { return; } if (event.getCharacter().isEmpty()) { // TODO: should we post an "empty" character? --- 1125,1152 ---- sendMouseWheelEvent(frame, event.getX(), event.getY(), swingModifiers, delta); } } ! private void sendMouseWheelEvent(LightweightFrameWrapper 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 = ! lwFrame.createMouseWheelEvent(source, swingModifiers, x, y, -wheelRotation); AccessController.doPrivileged(new PostEventAction(mouseWheelEvent)); } } private class SwingKeyEventHandler implements EventHandler<KeyEvent> { @Override public void handle(KeyEvent event) { ! LightweightFrameWrapper frame = lwFrame; if (frame == null) { return; } if (event.getCharacter().isEmpty()) { // TODO: should we post an "empty" character?
*** 1174,1185 **** 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); AccessController.doPrivileged(new PostEventAction(keyEvent)); } } } --- 1177,1188 ---- if (text.length() == 1) { swingChar = text.charAt(0); } } long swingWhen = System.currentTimeMillis(); ! java.awt.event.KeyEvent keyEvent = frame.createKeyEvent(frame, ! swingID, swingWhen, swingModifiers, swingKeyCode, ! swingChar); AccessController.doPrivileged(new PostEventAction(keyEvent)); } } }
< prev index next >