如何防止JPopupMenu的在它检查复选框时消失?
问题描述:
我想在JPopupMenu
使用JCheckBoxMenuItem
秒。它可以工作,但问题在于当复选框项目已被选中或未选中时,弹出菜单消失。因此,如果想要检查/取消选中几个项目,弹出窗口需要重复启动,这是令人烦恼的。奇怪的是,如果我在菜单中使用普通的JCheckBox
项(而不是JCheckBoxMenuItem
s),其行为与其应该一样:弹出窗口保留在此处,复选框可以选中/取消选中。完成后,弹出窗口可以通过点击外部来关闭。如何防止JPopupMenu的在它检查复选框时消失?
如何让我的弹出会那样,当项目有JCheckBoxMenuItem
S'我宁愿使用,因为他们的长相JCheckBoxMenuItem
秒。
答
好,发现工作回答http://forums.sun.com/thread.jspa?threadID=5432911。基本上,创建自定义的UI:
public class StayOpenCheckBoxMenuItemUI extends BasicCheckBoxMenuItemUI {
@Override
protected void doClick(MenuSelectionManager msm) {
menuItem.doClick(0);
}
public static ComponentUI createUI(JComponent c) {
return new StayOpenCheckBoxMenuItemUI();
}
}
,并将其设置在JCheckBoxMenuItem
:
myJCheckBoxMenuItem.setUI(new StayOpenCheckBoxMenuItemUI());
不知道这是最优雅的可能的解决方案,但完美的作品。
答
我遇到了不错的Joonas Pulakka答案,因为“UIManager lookandFeel”被忽略。
我发现下面的好的技巧上http://tips4java.wordpress.com/2010/09/12/keeping-menus-open/
的一点是它已被关闭后,立刻重新打开菜单,它是无形的,保持应用程序的外观和行为。
public class StayOpenCBItem extends JCheckBoxMenuItem {
private static MenuElement[] path;
{
getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
if (getModel().isArmed() && isShowing()) {
path = MenuSelectionManager.defaultManager().getSelectedPath();
}
}
});
}
public StayOpenCBItem(String text) {
super(text);
}
@Override
public void doClick(int pressTime) {
super.doClick(pressTime);
MenuSelectionManager.defaultManager().setSelectedPath(path);
}
}
我认为这是一个错误,应该由Swing库作者修复,而不是避免使用替代方法。唯一的问题是,Java开发人员宁愿找到解决问题的借口。 – 2015-03-15 21:57:40