2012-05-06 32 views
1

我是新來的人,這是我的第一篇文章。isSelected()無法識別JRadioButton和JCheckBox被選中

我有一個非常具體的需要編寫這個非常平凡的應用程序只調用isSelected()方法來檢查是否已選擇JRadioButton或JCheckBox。這意味着我不想循環一個ButtonGroup並調用它的getSelection()方法。

我的代碼也等同於由託尼·加迪斯,我目前從學習撰寫一本教科書的一個:通過對象開始接觸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));  
    } 
} 

這裏的一些見解:如果我改變了雙重的總變量,在BagelsPanel類1.0裏面calcBagel()方法,然後運行該應用程序,然後點擊一個JRadioButton「計算,「它準確地支持了一個JOptionPane告訴我我的總數是1.06美元(最終的雙倍變量TAX設置爲0.06)。

我真的很感謝任何幫助,我可以得到。我仍然是Java的初學者,不太明白爲什麼我的邏輯不正確。我很尷尬,這可能是非常微不足道的,但我已經檢查過這本書,代碼是一樣的。有什麼建議麼?

+0

試着向我們展示將重現該問題的最小代碼量:http://sscce.org。使用正確的代碼示例,您不需要太多解釋。 –

+1

閱讀這些代碼片段的人不知道變量的範圍,或者如何聲明按鈕,或者您爲什麼懷疑是Select()等等。您有很多解釋,但沒有足夠的信息。我會告訴你,要了解調試的難點之一就是相信你犯了一個錯誤,因此應該在代碼中查找它,而不是認爲它在別的地方肯定是個錯誤(如isSelected())。嘗試在你的用戶界面上放置一個JButton,並讓它的動作例程測試isSelected()和System.out.println()有關它的消息。 – arcy

+0

@SkipHead - 感謝您的鏈接。我真的有這樣的印象,但我認爲還有更多的科學。我一定會確保我在下次發佈時使用它。 –

回答

2

你的問題就在這裏,在你的actionPerformed方法:

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

而是調用上顯示,你正在創造新的面板從哪兒冒出來調用「計算的方法」面板中的方法calcBagel(), calcCoffee(), calcToppings()的在他們。當然,它們是用戶在UI中操作的不同對象。您應該保留對最初添加到GUI中的面板的引用,並對這些面板調用「calc-methods」,而不是在新創建的對象上。

P.S:你的代碼真的是混合模型和視圖。

+0

謝謝!你絕對正確!我不僅將這三類的實例作爲BagelApp類的私有實例變量,而且正如您所指出的那樣,我創建了全新的全新類。刪除這3個陳述解決了這個問題!我會爲你投票,但我無法獲得更高的信譽評分。再次感謝你。 –

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

這將是弄清楚發生了什麼事情與你的方法還有一個好辦法。你的問題也可能很容易不在這個方法中。但是,這將是一種發現的方式。

+0

感謝您的建議。我在這裏發佈之前嘗試過,但它只會在控制檯中輸出0.00。儘管如此,現在都解決了。然而,感謝您的輸入! –