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