Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用抓取事件掩码接收抓取事件?_Java_Swing_Events - Fatal编程技术网

Java 无法使用抓取事件掩码接收抓取事件?

Java 无法使用抓取事件掩码接收抓取事件?,java,swing,events,Java,Swing,Events,我添加了一个AWTEventListener来处理抓取事件。所以这个监听器只需使用sun.awt.SunToolkit.GRAB\u EVENT\u MASK 做记号 但此侦听器无法捕获UngrabEvent。棘手的是,当JComboBox弹出其菜单列表时,它可以捕获此事件。 我使用以下代码进行测试。 启动程序,单击框架的空白区域,单击框架标题。那就应该有一个不可饶恕的事件。但听众并没有捕捉到它。 启动程序,单击组合框并弹出其菜单列表。点击 框架标题。那就应该有一个不可饶恕的事件。然后听者捕捉到

我添加了一个AWTEventListener来处理抓取事件。所以这个监听器只需使用sun.awt.SunToolkit.GRAB\u EVENT\u MASK 做记号 但此侦听器无法捕获UngrabEvent。棘手的是,当JComboBox弹出其菜单列表时,它可以捕获此事件。 我使用以下代码进行测试。 启动程序,单击框架的空白区域,单击框架标题。那就应该有一个不可饶恕的事件。但听众并没有捕捉到它。 启动程序,单击组合框并弹出其菜单列表。点击 框架标题。那就应该有一个不可饶恕的事件。然后听者捕捉到它。 这很奇怪…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

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


为什么不在看到
isPopupTrigger()
时打开
JDialog
,并在另一个窗口激活时将其隐藏在停用状态?虽然垃圾神的推理是可以理解的,但它并没有回答这个问题:你实际上想做的事情不会起作用,因为即使抓取也要启动,你需要抓取一个窗口:
((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);
    }
}
然后,您将获得抓取事件,但在您正在处理的级别上,您不需要它们

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


我不知道这个
grab()
方法的内部结构,我也没有时间去调查,所以可能会有不太明显的副作用。风险自负。

我从来没有听说过抓取或取消抓取事件,但如果你解释一下你想完成什么,也许有人可以提供一种替代方法。JComboBox使用弹出列表。但如果我按下鼠标或某个键,弹出列表将隐藏。我想要一个弹出窗口,当鼠标在弹出窗口外按下时会隐藏,但当鼠标在弹出窗口上按下时不会隐藏。很高兴看到关于这个问题的一些讨论。在讨论中,问题没有得到解决。解决方法不是关于弹出,而是关于弹出菜单。是的,它看起来相当平台特定。我将考虑使用标准API的另一种方法,如上所述。