Java 设置按钮型号使复选框不可操作

Java 设置按钮型号使复选框不可操作,java,swing,model,jcheckbox,Java,Swing,Model,Jcheckbox,为什么我不能为JCheckBox设置按钮型号 下面的代码工作并绘制一个窗口,其中有一个复选框。复选框可操作: public class JCheckButton_Test { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ButtonModel b

为什么我不能为
JCheckBox
设置按钮型号

下面的代码工作并绘制一个窗口,其中有一个复选框。复选框可操作:

public class JCheckButton_Test {
public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            ButtonModel buttonModel = new DefaultButtonModel();

            JCheckBox checkBox = new JCheckBox();
            checkBox.setText("Check Box");
            //checkBox.setModel(buttonModel);

            JPanel controlPanel = new JPanel();
            controlPanel.add(checkBox);

            JFrame frame = new JFrame();

            frame.add(controlPanel, BorderLayout.CENTER);

            frame.pack();
            frame.setSize(640, 200);

            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    });
}
}
但是,如果我将模型添加到框中(取消注释行),复选框将变为不可操作(单击时不会更改)


为什么?

因为它是按钮的默认按钮模型实现,并作为按钮对您的操作作出反应。如果仍要使用
按钮模型
,则应为其实现复选框行为。 例如,您可以使用以下实现

......
 final ButtonModel buttonModel = new DefaultButtonModel();
 buttonModel.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        buttonModel.setSelected(!buttonModel.isSelected());
    }
 });
......

如何知道复选框是否被选中(从模型中)?在阅读关于的内容后,提出一个新问题。让我给您举一个关于
ToggleButtonModel
:“ToggleButton模型”的API。citate的结尾。下面有一些方法,用文字来完成。是的,但所有这些文字也没有说明属性反映复选框选中状态的内容。例如,
isSelected()
方法的描述是“检查按钮是否被选中”。这是从方法名称中可以看到的。没有任何单词“selected”表示“checked”。它将与您提供的任何允许的模型实现一起工作。问题是模型不知道如何对高级用户操作做出反应,但它仍然处理来自用户操作的事件,因此您必须通过事件处理来实现该功能。我认为“视图”应该直接与“模型”交互。它是用MVC模式实现的,也就是说视图是通过控制器而不是直接改变模型的。了解MVC模式
......
 final ButtonModel buttonModel = new DefaultButtonModel();
 buttonModel.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        buttonModel.setSelected(!buttonModel.isSelected());
    }
 });
......