栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > 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号