isSelected()无法识别JRadioButton和JCheckBox被选中

时间:2012-05-06 01:35:14

标签: java jpanel jradiobutton

我是新来的,这是我的第一篇文章。

我非常特别需要编写这个非常简单的应用程序,只调用isSelected()方法来检查是否已经选择了JRadioButton或JCheckBox。这意味着我不想循环遍历ButtonGroup并调用其getSelection()方法。

我的代码也与Tony Gaddis撰写的教科书相同,我目前正在学习:从Java开始从控制结构到对象第4版

这是一个逻辑问题,因为应用程序编译并运行时没有错误。

这是发生了什么:

我有四个类:BagelsPanel,CoffeePanel,ToppingsPanel和GUI类,BagelApp - 所有这些都扩展了JPanel ,而扩展了JFrame的BagelApp类。

该应用程序的目的是让用户做出咖啡,百吉饼和浇头选择,并返回所有选择的总价。问题是它不断返回0.00美元。

我怀疑,由于某种原因,isSelected()无法识别某些内容被选中。

我将发布以下涉及这些问题的BagelsPanel和GUI类代码:

public double calcBagel() {

    double total = 0.00;

    if(button1.isSelected())
        total = PLAIN;
    else if(button2.isSelected()) 
        total = WHOLE_WHEAT;
    else if(button3.isSelected()) 
        total = CINNA_RAISON;
    else if(button4.isSelected()) 
        total = EVERYTHING;

    return total;
}

以上是BagelsPanel类中的calcBagel()方法,该方法调用isSelected()方法来检查选择了哪个JRadioButton,然后将其价格分配给总计。以下是GUI类:

public void buildPanel() {

    panel = new JPanel();
    calc = new JButton("Calculate");
    calc.addActionListener(new ButtonListener());
    panel.add(calc);
}
private class ButtonListener implements ActionListener {

    public void actionPerformed(ActionEvent e) {

        double subtotal = 0.0;
        double total = 0.0;
        bagels = new BagelPanel();
        coffee = new CoffeePanel();
        toppings = new ToppingsPanel();

        subtotal = bagels.calcBagel() + coffee.calcCoffee() +
                    toppings.calcToppings();
        double tax = subtotal * TAX;
        total = subtotal + tax;

        DecimalFormat dollar = new DecimalFormat("$0.00");

        JOptionPane.showMessageDialog(null, "Your total is: " 
                    + dollar.format(total));    
    }
}

以下是一些见解:如果我将双变量total更改为BagelsPanel类中的calcBagel()方法为1.0,然后运行应用程序并单击JRadioButton“Calculate”,它会准确地告诉我一个JOptionPane告诉我我的总金额为1.06美元(最终的双变量TAX设定为0.06)。

我真的很感激我能得到任何帮助。我仍然是Java的初学者,并不太明白为什么我的逻辑不正确。我很尴尬,这可能是非常微不足道的,但我检查了这本书,代码是完全相同的。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您的问题就在这里,使用actionPerformed方法:

    double total = 0.0;
    bagels = new BagelPanel();
    coffee = new CoffeePanel();
    toppings = new ToppingsPanel();

不是在显示的面板上调用方法calcBagel(), calcCoffee(), calcToppings(),而是在不知情的情况下创建新面板并在其上调用“calc-methods”。当然,它们是用户在UI中操纵的对象的不同对象。您应该保留对最初添加到GUI的面板的引用,并在这些面板上调用“calc-methods”,而不是在新创建的对象上。

P.S:您的代码实际上是混合模型和视图。

答案 1 :(得分:1)

没有真正的SSCCE,这有点难以回答,但这就是我要做的:使用我最喜欢的IDE(在我的情况下为Netbeans),我会在开始时设置一个断点calcBagel()并逐步调试代码,以确保设置变量。

或者,您可以这样做:

public double calcBagel() {
    System.out.println("In calcBagel()");
    double total = 0.00;

    if(button1.isSelected()) {
        System.out.println("button1 is selected! Setting total to " + PLAIN);
        total = PLAIN;
    }
    else if(button2.isSelected())  {
        System.out.println("button2 is selected! Setting total to " + WHOLE_WHEAT);
        total = WHOLE_WHEAT;
    }
    else if(button3.isSelected())  {
        System.out.println("button3 is selected! Setting total to " + CINNA_RAISON);
        total = CINNA_RAISON;
    }
    else if(button4.isSelected())  {
        System.out.println("button4 is selected! Setting total to " + EVERYTHING);
        total = EVERYTHING;
    } else {
        System.out.println("No buttons were selected!");
    }
    System.out.println("total = " + total);
    return total;
}

这也是了解你的方法发生了什么的好方法。您的问题也很容易就不会出现在这种方法中。但这将是一种找到它的方法。