使用 JCheckBoxMenuItem 时,有没有办法禁用单击时自动检查状态切换?

问题描述 投票:0回答:1

我有一个

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);
    }
}

有可能做我想做的事吗?

java swing
1个回答
0
投票

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;
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.