栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JFrame Glasspane也位于JDialog之上,但不应

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JFrame Glasspane也位于JDialog之上,但不应

查看源代码,您只需将

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
是,他们遇到的问题是贪婪,它们阻止事件层叠到所注册的组件之外。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/398299.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号