Swing 如何防止选中其中的复选框时JPOppMenu消失?
我想在Swing 如何防止选中其中的复选框时JPOppMenu消失?,swing,jcheckbox,jpopupmenu,Swing,Jcheckbox,Jpopupmenu,我想在jpopmenus中使用JCheckBoxMenuItems。它可以工作,但问题是当复选框项被选中或取消选中时,弹出菜单会消失。因此,如果想勾选/取消勾选多个项目,则需要反复启动弹出窗口,这令人恼火 奇怪的是,如果我只在菜单中使用普通的JCheckBox项(而不是JCheckBoxMenuItems),那么行为就像它应该的那样:弹出窗口保持在那里,复选框可以被选中/取消选中。完成后,只需在弹出窗口外部单击即可关闭弹出窗口 当存在JCheckBoxMenuItems项时,如何使弹出窗口的行为
jpopmenus
中使用JCheckBoxMenuItem
s。它可以工作,但问题是当复选框项被选中或取消选中时,弹出菜单会消失。因此,如果想勾选/取消勾选多个项目,则需要反复启动弹出窗口,这令人恼火
奇怪的是,如果我只在菜单中使用普通的JCheckBox
项(而不是JCheckBoxMenuItem
s),那么行为就像它应该的那样:弹出窗口保持在那里,复选框可以被选中/取消选中。完成后,只需在弹出窗口外部单击即可关闭弹出窗口
当存在
JCheckBoxMenuItem
s项时,如何使弹出窗口的行为与之类似?我更喜欢使用JCheckBoxMenuItem,因为它们的外观。嗯,从中找到了有效的答案。基本上,创建自定义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外观”被忽略了 我发现了下面的好把戏 关键是在菜单关闭后立即重新打开它,它是不可见的,并保持应用程序的外观和行为
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);
}
}
“工作答案”指的是论坛sun com的链接,该链接已断开。有关此解决方案的其他信息可在此处找到:我认为这是一个bug,应由Swing库作者修复,而不是避免使用变通方法。唯一的问题是,Java开发人员宁愿找借口也不愿修复他们的bug。对我来说,在
jpopmenu
中使用时,这不起作用。引用文章作者的评论“此处提供的增强功能不适用于任何类型的弹出菜单。”