src/share/classes/sun/swing/JLightweightFrame.java
Print this page
*** 23,44 ****
--- 23,51 ----
* 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,57 ****
--- 53,66 ----
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,128 ****
--- 128,193 ----
}
}
};
}
+ 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.