我想在JCheckBoxMenuItem
中使用JPopupMenu
。它可以工作,但问题是当选中或取消选中复选框项时,弹出菜单会消失。因此,如果要检查/取消选中多个项目,则需要重复启动弹出窗口,这很烦人。
奇怪的是,如果我只使用菜单中的普通JCheckBox
项(而不是JCheckBoxMenuItem
s),行为就像它应该的那样:弹出窗口停留在那里,可以检查复选框/选中。完成后,只需在外部单击即可关闭弹出窗口。
当JCheckBoxMenuItem
的项目为{?}时,如何让弹出窗口表现得像那样?我更喜欢使用JCheckBoxMenuItem
s,因为它们的外观。
答案 0 :(得分:12)
好吧,找到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());
不知道这是否是最优雅的解决方案,但效果很好。
答案 1 :(得分:3)
我遇到了一个很好的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);
}
}