我添加了一个AWTEventListener来处理抓取事件。因此,此侦听器仅使用sun.awt.SunToolkit.GRAB_EVENT_MASK
标记。
但是此侦听器无法捕获UngrabEvent。棘手的事情是,当JComboBox弹出其菜单列表时,它可以捕获此事件。
我使用以下代码进行测试。
启动程序,单击框架的空白区域,单击框架标题。然后应该有一个UngrabEvent。但是侦听器不会捕获它。
启动程序,单击组合框,然后弹出其菜单列表。点击
框架标题。然后应该有一个UngrabEvent。然后听众捕获它。
这很奇怪... UngrabEvent和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);
    }
}

最佳答案

我感觉到您正在尝试;但通常,您不应该依赖Sun / Oracle的未记录API。


  我想要一个弹出窗口,当
  在弹出窗口外按下鼠标,但是
  在弹出窗口上按下鼠标时不会隐藏。


为什么在看到JDialog时不显示它,而又看到另一个窗口被激活时却隐藏了它,为什么不隐藏它呢?在here中讨论了该概念。

10-08 02:56