JCheckBox не отменяет выбор во время выполнения

Я создал базовую программу, которая использует переключатели, кнопки и флажки. Моя проблема в том, что во время выполнения флажки могут быть установлены, но не сняты. Я почти уверен, что это что-то простое, но я пробовал фрагменты кода с веб-сайта оракула, и это не сработало. Может ли кто-нибудь указать мне правильное направление? Спасибо.

Это внутренний класс, который обрабатывает события для флажков. Предполагается получить событие и установить для переменных соответствующие цены. Я пробовал 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));

        }
    }
}

person iwatakeshi    schedule 18.11.2012    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 18.11.2012
comment
вы хотите отменить выбор всех элементов в ButtonGroup ???   -  person mKorbel    schedule 18.11.2012


Ответы (1)


Возможно, попробуйте изменить оба:

if(vMail.isSelected())

а также:

if(textMes.isSelected())

to:

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

Пересмотренный ответ ниже на основе новой информации

Хорошо, есть несколько проблем:

  1. Удалите весь код, связанный с файлом checkboxgroup. Вы не хотите использовать ButtonGroup от флажков! Это ваша основная проблема. ButtonGroup обычно используется только для JRadioButtons
  2. Создайте только один экземпляр CheckBoxListener, т.е.:

    // Add action listener to the check boxes
    CheckBoxListener checkBoxListener = new CheckBoxListener();
    vMail.addItemListener(checkBoxListener);
    textMes.addItemListener(checkBoxListener);
person Muel    schedule 18.11.2012
comment
Это все еще дает мне ту же проблему. У меня есть другие внутренние классы, которые используются другими кнопками. Как вы думаете, они влияют на события из флажка? Должен ли я опубликовать больше кода? - person iwatakeshi; 18.11.2012
comment
Трудно сказать, не видя другие классы! :) Не могли бы вы вставить код, который вы добавляете CheckBoxListener как ItemListener? Кроме того, то, как вы определили CheckBoxListener, выглядит/кажется мне неправильным. У него не должно быть никаких статических членов (полей и методов), и вместо того, чтобы иметь методы get*Price(), можете ли вы вместо этого переместить значения цены в нужные места? По сути, у слушателя не должно быть собственного внутреннего состояния. Надеюсь, это имеет смысл! - person Muel; 18.11.2012
comment
Да, я хотел, чтобы кнопка OK вычисляла переменные после того, как пользователь нажмет кнопку, поэтому я сначала подумал об использовании статики. Пока математика работает, но не флажок. :) - person iwatakeshi; 18.11.2012
comment
@iwatakeshi Удаление ButtonGroup решило проблему? - person Muel; 18.11.2012
comment
Да! Спасибо. Но мне интересно, почему группировка флажков влияет на события? - person iwatakeshi; 18.11.2012
comment
@iwatakeshi Прочитайте Javadoc для ButtonGroup. В вашем случае получается, что JCheckBox extends JToggleButton и JToggleButton делегируют управление своим выбранным состоянием ButtonGroup, если JToggleButton было добавлено к ButtonGroup. - person Muel; 19.11.2012