src/share/classes/sun/swing/JLightweightFrame.java

Print this page

        

@@ -23,22 +23,29 @@
  * questions.
  */
 
 package sun.swing;
 
+import java.awt.AWTEvent;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
 import java.awt.Container;
 import java.awt.Dimension;
 import java.awt.EventQueue;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
+import java.awt.MouseInfo;
+import java.awt.Point;
 import java.awt.Rectangle;
+import java.awt.event.AWTEventListener;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
 import java.awt.event.ComponentListener;
 import java.awt.event.ContainerEvent;
 import java.awt.event.ContainerListener;
+import java.awt.event.MouseEvent;
 import java.awt.image.BufferedImage;
 import java.awt.image.DataBufferInt;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.security.AccessController;

@@ -46,12 +53,14 @@
 import javax.swing.JLayeredPane;
 import javax.swing.JPanel;
 import javax.swing.JRootPane;
 import javax.swing.LayoutFocusTraversalPolicy;
 import javax.swing.RootPaneContainer;
+import javax.swing.SwingUtilities;
 
 import sun.awt.LightweightFrame;
+import sun.awt.LightweightFramePeer;
 import sun.security.action.GetPropertyAction;
 
 /**
  * The frame serves as a lightweight container which paints its content
  * to an offscreen image and provides access to the image's data via the

@@ -62,10 +71,19 @@
  * @author Artem Ananiev
  * @author Anton Tarasov
  */
 public final class JLightweightFrame extends LightweightFrame implements RootPaneContainer {
 
+    static {
+        SwingAccessor.setJLightweightFrameAccessor(new SwingAccessor.JLightweightFrameAccessor() {
+            @Override
+            public LightweightContent getLightweightContent(JLightweightFrame frame) {
+                return frame.content;
+            }
+        });
+    }
+
     private final JRootPane rootPane = new JRootPane();
 
     private LightweightContent content;
 
     private Component component;

@@ -119,10 +137,58 @@
                 }
             }
         };
     }
 
+    private LightweightFramePeer getLwPeer() {
+        return (LightweightFramePeer)getPeer();
+    }
+
+    private final AWTEventListener mouseEventListener = (AWTEvent event) -> {
+        MouseEvent m = (MouseEvent)event;
+
+        if (!SwingUtilities.isDescendingFrom(m.getComponent(), this)) return;
+
+        switch (m.getID()) {
+            case MouseEvent.MOUSE_ENTERED:
+                getLwPeer().setLightweightFrameUnderMouse();
+                getLwPeer().updateCursorImmediately();
+                break;
+            case MouseEvent.MOUSE_EXITED:
+                Point location = SwingUtilities.convertPoint(m.getComponent(), m.getPoint(), this);
+                if ((!this.contains(location) || !this.isActive()) &&
+                        getLwPeer().cleanLightweightFrameUnderMouse()) {
+                    getLwPeer().updateCursorImmediately();
+                }
+                break;
+        }
+    };
+
+    private final ComponentListener componentListener =  new ComponentAdapter() {
+        @Override
+        public void componentShown(ComponentEvent e) {
+            if (getBounds().contains(MouseInfo.getPointerInfo().getLocation())) {
+                getLwPeer().setLightweightFrameUnderMouse();
+                getLwPeer().updateCursorImmediately();
+            }
+        }
+    };
+
+    @Override
+    public void addNotify() {
+        super.addNotify();
+        getToolkit().addAWTEventListener(mouseEventListener, AWTEvent.MOUSE_EVENT_MASK);
+        addComponentListener(componentListener);
+    }
+
+    @Override
+    public void removeNotify() {
+        super.removeNotify();
+        getToolkit().removeAWTEventListener(mouseEventListener);
+        removeComponentListener(componentListener);
+    }
+
     /**
      * Sets the {@link LightweightContent} instance for this frame.
      * The {@code JComponent} object returned by the
      * {@link LightweightContent#getComponent()} method is immediately
      * added to the frame's content pane.