代码之家  ›  专栏  ›  技术社区  ›  DeepNightTwo

无法使用grab\u event\u MASK接收grab事件?

  •  2
  • DeepNightTwo  · 技术社区  · 16 年前

    我添加了一个AWTEventListener来处理grab事件。所以这个侦听器只需使用sun.awt.SunToolkit.GRAB\u EVENT\u MASK 但此侦听器无法捕获ungrabbevent。棘手的是,当JComboBox弹出其菜单列表时,它可以捕获此事件。 我使用以下代码进行测试。 启动程序,点击框架的空白区域,点击框架标题。那就应该有一个不可饶恕的事件。但听众并没有捕捉到它。 启动程序,点击组合框并弹出菜单列表。点击 很奇怪…ungrabbevent和JComboBox之间有什么关系吗?

    public class ComboboxLearn {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Toolkit toolkit = Toolkit.getDefaultToolkit();
            toolkit.addAWTEventListener(new AWTEventListener() {
    
                @Override
                public void eventDispatched(AWTEvent event) {
                    System.out.println(event);
                }
            }, sun.awt.SunToolkit.GRAB_EVENT_MASK);
            JComboBox box = new JComboBox(new Object[] { "AAA", "BBB", "CCC" });
    
            box.addPopupMenuListener(new PopupMenuListener() {
    
                @Override
                public void popupMenuCanceled(PopupMenuEvent e) {
                    System.out.println(e);
                }
    
                @Override
                public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
                    System.out.println(e);// Set a breakpoint here
                }
    
                @Override
                public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                    System.out.println(e);
                }
            });
    
            JFrame f = new JFrame();
            f.getContentPane().setLayout(new FlowLayout());
            f.getContentPane().add(box);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(new Dimension(100, 100));
    
            f.setVisible(true);
        }
    }
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    我感觉你在试验;但一般来说,您不应该依赖Sun/Oracle的未记录api。

    我想要一个弹出窗口,当

    为什么不提个问题 JDialog isPopupTrigger() 当你看到另一个窗口激活时,把它隐藏起来?讨论了这一概念 here .

        2
  •  0
  •   Stelios Adamantidis    7 年前

    抓住 : ((SunToolkit)Toolkit.getDefaultToolkit()).grab(someWindow); .

    class ComboboxLearn {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Toolkit toolkit = Toolkit.getDefaultToolkit();
            toolkit.addAWTEventListener(new AWTEventListener() {
    
                @Override
                public void eventDispatched(AWTEvent event) {
                    System.out.println(event);
                }
            }, sun.awt.SunToolkit.GRAB_EVENT_MASK);
            JComboBox box = new JComboBox(new Object[] { "AAA", "BBB", "CCC" });
    
            JFrame f = new JFrame();
            box.addPopupMenuListener(new PopupMenuListener() {
    
                @Override
                public void popupMenuCanceled(PopupMenuEvent e) {
                    System.out.println(e);
                }
    
                @Override
                public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
                    System.out.println(e);// Set a breakpoint here
                    //UNGRABBING WINDOW
                    ((SunToolkit) toolkit).ungrab(f);
                }
    
                @Override
                public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                    System.out.println(e);
                    //GRABBING WINDOW
                    ((SunToolkit) toolkit).grab(f);
                }
            });
    
            f.getContentPane().setLayout(new FlowLayout());
            f.getContentPane().add(box);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(new Dimension(100, 100));
    
            f.setVisible(true);
        }
    }
    

    然后你会得到你的抓取事件 但是 在你工作的层面上,你不需要它们。

    那我什么时候需要它们?

    this nasty bug 虽然关闭了,但我仍然可以复制它,您需要实现自己的弹出机制。你做的一切都很好,你附加了你的AWT监听器关闭弹出窗口时,有一个点击外,但有些东西是丢失的。你点击任何地方,弹出窗口就会消失,除了窗口标题和你的应用程序之外!开枪你想!jpopmpmenu是如何实现的。在您花了一些时间阅读jdk代码并尝试各种各样的东西之后,您意识到正是这个未记录的事件起了作用。

    grab() 方法和我没有时间调查,所以可能有副作用不是很明显。风险自负。