JPopupMenu行为

我在下面准备了一个小测试用例。 我的问题是当我右键单击窗口时。 JPopupMenu出现但如果我点击JWindow菜单外的任何地方都不会消失。 我必须单击窗口上的某个位置来摆脱它,这不是预期的行为。

编辑:在阅读akf的答案后,我切换到JFrame,当帧处于焦点并且弹出菜单显示时,当您单击另一个窗口时它会消失。 但如果窗口没有焦点,你单击某处菜单不会消失。

import javax.swing.*; import java.awt.*; import java.awt.event.*; class test { static class window extends JWindow implements MouseListener, MouseMotionListener{ JPopupMenu popMenu; JPanel panel = new JPanel(); Point location; MouseEvent pressed; public window(){ addMouseListener( this ); addMouseMotionListener( this ); JLabel label = new JLabel("JWindow", JLabel.CENTER); initPopMenu(); add(label); setVisible(true); setAlwaysOnTop(true); setLocationRelativeTo(null); pack(); } public void initPopMenu(){ popMenu = new JPopupMenu(); JMenuItem item; item = new JMenuItem( "Title" ); item.setEnabled(false); popMenu.add(item); popMenu.addSeparator(); item = new JMenuItem( "Item One" ); popMenu.add(item); item = new JMenuItem( "Item 2" ); popMenu.add(item); item = new JMenuItem( "Item 3" ); popMenu.add(item); } public void mousePressed(MouseEvent e) { pressed = e; int nModifier = e.getModifiers(); if (((nModifier & InputEvent.BUTTON2_MASK) != 0)|| ((nModifier & InputEvent.BUTTON3_MASK) != 0)) popMenu.show( this, e.getX(), e.getY() ); } public void mouseClicked(MouseEvent e) { } public void mouseReleased(MouseEvent e) {} public void mouseDragged(MouseEvent me){ } public void mouseMoved(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} } public static void main(String[] args) { window dw = new window(); } } 

查看Java Doc for JWindow.isFocusableWindow JWindow不能成为焦点窗口,除非它拥有所有者且所有者可见。 您正在使用默认构造函数,因此您的JWindow具有共享所有者asn不可聚焦。 当它不可聚焦时,当您单击其他位置时,它无法检测到焦点丢失。

我将JWindow更改为JFrame并添加了对setUndecorated(true);的调用setUndecorated(true); 在调用setVisible之前它正在为我工​​作。 如果这些更改不适合您,请发布您正在使用的Java版本: java -fullversion

在Windows上的Java 6中,我无法使用您提供的代码显示弹出窗口。 另一方面,如果我将你的超类更改为JFrame,它会按照需要运行,当我在窗口外单击时弹出窗口会消失。 您是否有理由将JWindow用作超类而不是JFrame ? 如果你想拥有一个无边框/无标题的窗口,你可以在你的JFrame上调用setUndecorated(true) (当然,在设置visible和pack之前)。

如果从MouseExited方法中可见菜单,隐藏菜单怎么样?