< 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,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 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();
--- 174,185 ----
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();
*** 329,353 ****
}
}
}
/**
! * 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);
}
/*
--- 329,353 ----
}
}
}
/**
! * Calls LightweightFrameWrapper.notifyDisplayChanged.
* Must be called on EDT only.
*/
! private static OptionalMethod<LightweightFrameWrapper> jlfNotifyDisplayChanged;
! private static OptionalMethod<LightweightFrameWrapper> jlfOverrideNativeWindowHandle;
static {
! jlfNotifyDisplayChanged = new OptionalMethod<>(LightweightFrameWrapper.class,
"notifyDisplayChanged", Double.TYPE, Double.TYPE);
if (!jlfNotifyDisplayChanged.isSupported()) {
jlfNotifyDisplayChanged = new OptionalMethod<>(
! LightweightFrameWrapper.class,"notifyDisplayChanged", Integer.TYPE);
}
! jlfOverrideNativeWindowHandle = new OptionalMethod<>(LightweightFrameWrapper.class,
"overrideNativeWindowHandle", Long.TYPE, Runnable.class);
}
/*
*** 357,367 ****
if (lwFrame != null) {
lwFrame.dispose();
lwFrame = null;
}
if (content != null) {
! lwFrame = new JLightweightFrame();
SwingNodeWindowFocusListener snfListener =
new SwingNodeWindowFocusListener(this);
lwFrame.addWindowFocusListener(snfListener);
--- 357,367 ----
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) -> {
--- 557,568 ----
};
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
--- 672,686 ----
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();
--- 796,808 ----
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) {
--- 837,847 ----
}
});
}
}
! 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);
}
--- 865,886 ----
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);
}
}
--- 981,1014 ----
}
}
}
}
! @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 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);
}
}
*** 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) {
--- 1046,1056 ----
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);
--- 1084,1105 ----
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?
--- 1119,1146 ----
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));
}
}
}
--- 1171,1182 ----
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 >