我是新来的,这是我的第一篇文章。
我非常特别需要编写这个非常简单的应用程序,只调用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的初学者,并不太明白为什么我的逻辑不正确。我很尴尬,这可能是非常微不足道的,但我检查了这本书,代码是完全相同的。有什么建议吗?
答案 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;
}
这也是了解你的方法发生了什么的好方法。您的问题也很容易就不会出现在这种方法中。但这将是一种找到它的方法。