查看源代码,您只需将
frame的玻璃窗格注册到AWTListener。现在,从表面上看,这似乎不是一件坏事。系统
AWTListener会将所有鼠标事件通知给,但是
GlassPane实际上接收到该事件的实例只会知道
frame…
基本上,这意味着
dialogGlas不会接收任何事件,因为它尚未注册。
首先,您需要同时注册
frameGlas和
dialogGlas作为侦听器。
其次,您不应该试图“猜测”目标。
MouseEvent(实际上所有事件)都有来源。您应该将来源与进行比较,
target以便仅在事件发生在您感兴趣的组件上时才对事件做出反应…
import java.awt.AWTEvent;import java.awt.Component;import java.awt.EventQueue;import java.awt.Point;import java.awt.Toolkit;import java.awt.Window;import java.awt.event.AWTEventListener;import java.awt.event.MouseEvent;import javax.swing.JDialog;import javax.swing.Jframe;import javax.swing.JPanel;import javax.swing.SwingUtilities;import javax.swing.UIManager;import javax.swing.UnsupportedLookAndFeelException;public class Main { static Jframe frame; static JDialog dialog; public static void main(String[] args) { new Main(); } public Main() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } frame = new Jframe(); frame.setSize(600, 600); GlassPane frameGlas = new GlassPane(frame); frame.setGlassPane(frameGlas); frame.setVisible(true); frameGlas.setVisible(true); dialog = new JDialog(frame); dialog.setSize(100, 100); GlassPane dialogGlas = new GlassPane(dialog); dialog.setGlassPane(dialogGlas); dialogGlas.setVisible(true); dialog.setVisible(true); // Register a listener for the frameGlas Toolkit.getDefaultToolkit().addAWTEventListener( frameGlas, AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK); // Register a listener for the dialogGlas Toolkit.getDefaultToolkit().addAWTEventListener( dialogGlas, AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK); } }); } public class GlassPane extends JPanel implements AWTEventListener { private static final long serialVersionUID = 5110857185182004819L; private final Window target; public GlassPane(Window target) { super(null); this.target = target; } @Override public void eventDispatched(AWTEvent event) { if (event instanceof MouseEvent) { MouseEvent originalEvent = (MouseEvent) event; MouseEvent e = originalEvent; Component source = e.getComponent(); System.out.println("Source: " + source); System.out.println("Target: " + target); if (target != null && target.equals(source)) { e = SwingUtilities.convertMouseEvent( ((MouseEvent) event).getComponent(), (MouseEvent) event, this); if (e.getID() == MouseEvent.MOUSE_PRESSED) { Point p = target.getLocationOnScreen(); System.out.println(p.getX()); } } } } }}现在,让我烦恼的
MouseListener是,他们遇到的问题是贪婪,它们阻止事件层叠到所注册的组件之外。



