我有一个
JCheckBoxMenuItem
,我需要手动控制其中的检查状态。 我在文档中没有看到任何可以控制该行为的内容。 我还尝试创建自己的自定义子类 JCheckBoxMenuItem
并覆盖 processMouseEvent()
而不改变行为。
@Override
public void processMouseEvent(MouseEvent e, MenuElement[] path, MenuSelectionManager manager)
{
// Disable the default toggle behavior.
if (e.getID() == MouseEvent.MOUSE_CLICKED) // checking for MOUSE_PRESSED or MOUSE_RELEASED does not work either
{
//setSelected(!isSelected());
e.consume();
}
else
{
super.processMouseEvent(e, path, manager);
}
}
有可能做我想做的事吗?
A
JMenuItem
是 AbstractButton
的子类,因此,它的行为由其 ButtonModel
控制。您不必在您的情况下实现自定义模型,据我了解,您希望 JCheckBoxMenuItem
的外观具有普通 JMenuItem
的行为,也就是说,当菜单时会触发一个操作项目被选择,但没有(自动)更改所选状态。应用程序的操作或某些其他部分可能会独立更改所选状态。对于此行为,DefaultButtonModel
即可。
以下示例程序将仅在每隔两个选择时切换
JCheckBoxMenuItem
:
public static void main(String[] args) {
JMenuBar mb = new JMenuBar();
JMenuItem menuItem = mb.add(new JMenu("Example"))
.add(new JCheckBoxMenuItem("The Checkbox Item"));
menuItem.setModel(new DefaultButtonModel()); // override behavior
JFrame frame = new JFrame("Demo");
frame.setJMenuBar(mb);
menuItem.addActionListener(ev -> customToggle(menuItem, frame));
frame.setSize(300, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
static boolean notYet = true;
private static Object customToggle(JMenuItem menuItem, JFrame frame) {
if(notYet) {
frame.setTitle("Select again to toggle");
notYet = false;
} else {
frame.setTitle("Toggled");
menuItem.setSelected(!menuItem.isSelected());
notYet = true;
}
return null;
}