1

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

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

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

        }
    }
}
4

1 回答 1

1

也许尝试改变两者:

if(vMail.isSelected())

和:

if(textMes.isSelected())

至:

if(e.getStateChange() == ItemEvent.SELECTED)

下面根据新信息修改答案

好的,有几个问题:

  1. 删除所有与checkboxgroup. 您不想使用ButtonGroupfrom 复选框!这是你的主要问题。仅一般ButtonGroup用于JRadioButtons
  2. 只创建一个实例CheckBoxListener,即:

    // Add action listener to the check boxes
    CheckBoxListener checkBoxListener = new CheckBoxListener();
    vMail.addItemListener(checkBoxListener);
    textMes.addItemListener(checkBoxListener);
于 2012-11-18T06:05:00.620 回答