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.