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

@@ -119,10 +128,66 @@
                 }
             }
         };
     }
 
+    private LightweightFramePeer getLwPeer() {
+        return (LightweightFramePeer)getPeer();
+    }
+
+    private final AWTEventListener mouseEventListener = new AWTEventListener() {
+        @Override
+        public void eventDispatched(AWTEvent event) {
+            MouseEvent m = (MouseEvent) event;
+
+            if (!SwingUtilities.isDescendingFrom(m.getComponent(), JLightweightFrame.this)) return;
+
+            switch (m.getID()) {
+                case MouseEvent.MOUSE_ENTERED:
+                    getLwPeer().setLightWeightFrameUnderMouse();
+                    getLwPeer().updateCursorImmediately();
+                    break;
+                case MouseEvent.MOUSE_EXITED:
+                    LightweightFrame frame = JLightweightFrame.this;
+                    Point location = SwingUtilities.convertPoint(m.getComponent(), m.getPoint(), frame);
+                    if ((!frame.contains(location) || !frame.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);
+    }
+
+    public void invokeOnContentsThread(Runnable r) {
+        content.invokeOnContentsThread(r);
+    }
+
     /**
      * 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.