Java JCheckBox在运行时不会取消选择

Java JCheckBox在运行时不会取消选择,java,swing,jcheckbox,Java,Swing,Jcheckbox,我创建了一个使用单选按钮、按钮和复选框的基本程序。我的问题是,在运行时可以选中复选框,但不能取消选中。我很确定这很简单,但我试过oracle网站上的代码片段,但似乎不起作用。有人能给我指出正确的方向吗?谢谢 这是一个处理复选框事件的内部类。假设它接收事件并将变量设置为适当的价格。我试过其他方法,但似乎不起作用 private void buildPanel() { //Create the label, radio buttons, check boxes, and buttons

我创建了一个使用单选按钮、按钮和复选框的基本程序。我的问题是,在运行时可以选中复选框,但不能取消选中。我很确定这很简单,但我试过oracle网站上的代码片段,但似乎不起作用。有人能给我指出正确的方向吗?谢谢

这是一个处理复选框事件的内部类。假设它接收事件并将变量设置为适当的价格。我试过
其他方法
,但似乎不起作用

private void buildPanel()
{
    //Create the label, radio buttons, check boxes, and buttons
    messageLabel = new JLabel("Select the package of your choice: ");
    min1 = new JRadioButton("300 Minutes - $45.00 per month.");
    min2 = new JRadioButton("800 Minutes - $65.00 per month.");
    min3 = new JRadioButton("1500 Minutes -  $99.00 per month.");

    model1 = new JRadioButton("Model 100 - $29.95");
    model2 = new JRadioButton("Model 110 - $49.95 ");
    model3 = new JRadioButton("Model 200 - $99.95");

    vMail = new JCheckBox("Voice Mail  - $5.00 per month.");
    vMail.setSelected(false);
    textMes = new JCheckBox("Text Messaging - $10.00 per month.");
    textMes.setSelected(false);

    okButton = new Button("OK");

    //Group the radio buttons
    radiogroupmin = new ButtonGroup();
    radiogroupmin.add(min1);
    radiogroupmin.add(min2);
    radiogroupmin.add(min3);

    radiogroupmodel = new ButtonGroup();
    radiogroupmodel.add(model1);
    radiogroupmodel.add(model2);
    radiogroupmodel.add(model3);

    //Group the check boxes
    checkboxgroup = new ButtonGroup();

    checkboxgroup.add(vMail);
    checkboxgroup.add(textMes);

    //Add action listener to the radio buttons
    min1.addActionListener(new RadioButtonListener());
    min2.addActionListener(new RadioButtonListener());
    min3.addActionListener(new RadioButtonListener());

    model1.addActionListener(new RadioButtonListener());
    model2.addActionListener(new RadioButtonListener());
    model3.addActionListener(new RadioButtonListener());

    //Add action listener to the check boxes
    vMail.addItemListener(new CheckBoxListener());
    textMes.addItemListener(new CheckBoxListener());

    //Add action listener to the button
    okButton.addActionListener(new ButtonListener());

    //create a panel and add the components to it
    panel = new JPanel(new BorderLayout());
    panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

    panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
    panel.add(messageLabel);
    panel.add(min1);
    panel.add(min2);
    panel.add(min3);


    panel.add(model1);
    panel.add(model2);
    panel.add(model3);


    panel.add(vMail);
    panel.add(textMes);     

    panel.add(okButton);
}

public static class RadioButtonListener implements ActionListener
{       
        public static double minPrice;
        public static String model;
        public static double modelPrice = 0.0;

    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == min1)
        {
            minPrice = 45.00;
        }
        else if(e.getSource() == min2)
        {
            minPrice = 65.00;
        }
        else if(e.getSource() == min3)
        {
            minPrice = 99.00;
        }

        if(e.getSource() == model1)
        {
            model = "Model 100";
            modelPrice = 29.00;
        }
        else if(e.getSource() == model2)
        {
            model = "Model 110";
            modelPrice = 49.99;
        }
        else if(e.getSource() == model3)
        {
            model = "Model 200";
            modelPrice = 99.99;
        }
    }


    public static double getMinPrice()
    {
        return minPrice;
    }

    public static  String getModel()
    {
        return model;
    }

    public static double getModelPrice()
    {
        return modelPrice;
    }
}

public static class CheckBoxListener implements ItemListener
{

    static double voicePrice;
    static double  textPrice;
    public void itemStateChanged(ItemEvent e) 
    {
        if(e.getSource() == vMail)
        {
            if (e.getStateChange() == ItemEvent.SELECTED)
            {
            voicePrice = 5.00;
            }
            else
            {
            voicePrice = 0.0;
            }
        }           

        if(e.getSource() == textMes)
        {
            if(e.getStateChange() == ItemEvent.SELECTED)
            {
                textPrice = 10.00;
            }
            else
            {
                textPrice = 0.0;
            }
        }
    }

    public static double getVoicePrice()
    {
        return voicePrice;
    }

    public static double getTextPrice()
    {
        return textPrice;
    }   

}
private  class ButtonListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == okButton)
        {
            DecimalFormat df = new DecimalFormat("$00.##");

            double total;
            final double tax = 0.6;
            final double modelTax = (RadioButtonListener.getModelPrice() * tax) + RadioButtonListener.getModelPrice();
            total = RadioButtonListener.getMinPrice() + 
                    modelTax + CheckBoxListener.getVoicePrice() + CheckBoxListener.getTextPrice(); 
            JOptionPane.showMessageDialog(null, "Your total is: " + df.format(total));

        }
    }
}

或许可以尝试改变这两种情况:

if(vMail.isSelected())
以及:

致:

根据新信息修改了以下答案

好的,有几个问题:

  • 删除与复选框组相关的所有代码。您不想使用复选框中的
    按钮组
    !这是你的主要问题。
    ButtonGroup
    通常仅用于
    JRadioButtons
  • 仅创建一个
    CheckBoxListener
    实例,即:

  • 或许可以尝试改变这两种情况:

    if(vMail.isSelected())
    
    以及:

    致:

    根据新信息修改了以下答案

    好的,有几个问题:

  • 删除与复选框组相关的所有代码。您不想使用复选框中的
    按钮组
    !这是你的主要问题。
    ButtonGroup
    通常仅用于
    JRadioButtons
  • 仅创建一个
    CheckBoxListener
    实例,即:

  • 它仍然给了我同样的问题。我有其他按钮使用的其他内部类。您认为它们是否影响复选框中的事件?我应该发布更多的代码吗?很难说没有看到其他类!)能否将添加的代码粘贴为
    itemstener
    ?另外,我觉得你定义CheckBoxListener的方式是错误的。它不应该有任何静态成员(字段和方法),而不是使用
    get*Price()
    方法,您可以将价格值推送到所需的位置吗?基本上,侦听器不应该有自己的内部状态。希望这有意义!是的,我想在用户按下OK按钮后用OK按钮来计算变量,所以我首先想到了使用static。到目前为止,数学是可行的,但复选框不起作用。:)@iwatakeshi是否删除了
    按钮组
    解决了问题?@iwatakeshi阅读了
    按钮组
    的Javadoc。在你的例子中,
    JCheckBox扩展了JToggleButton
    JToggleButton
    将其“选定状态”的管理委托给
    ButtonGroup
    ,如果
    JToggleButton
    被添加到
    ButtonGroup
    ,它仍然给我同样的问题。我有其他按钮使用的其他内部类。您认为它们是否影响复选框中的事件?我应该发布更多的代码吗?很难说没有看到其他类!)能否将添加的代码粘贴为
    itemstener
    ?另外,我觉得你定义CheckBoxListener的方式是错误的。它不应该有任何静态成员(字段和方法),而不是使用
    get*Price()
    方法,您可以将价格值推送到所需的位置吗?基本上,侦听器不应该有自己的内部状态。希望这有意义!是的,我想在用户按下OK按钮后用OK按钮来计算变量,所以我首先想到了使用static。到目前为止,数学是可行的,但复选框不起作用。:)@iwatakeshi是否删除了
    按钮组
    解决了问题?@iwatakeshi阅读了
    按钮组
    的Javadoc。在您的案例中,
    JCheckBox扩展了JToggleButton
    JToggleButton
    将其“选定状态”的管理委托给
    ButtongGroup
    ,如果
    JToggleButton
    已添加到
    ButtongGroup
    。为了更快地获得更好的帮助,发布一个。是否要取消选择ButtonGroup中的所有元素???要更快获得更好的帮助,请发布一个。是否要取消选择ButtonGroup中的所有元素???
    if(e.getStateChange() == ItemEvent.SELECTED)
    
    
        // Add action listener to the check boxes
        CheckBoxListener checkBoxListener = new CheckBoxListener();
        vMail.addItemListener(checkBoxListener);
        textMes.addItemListener(checkBoxListener);