1

私はここで新しいです、そしてこれは私の最初の投稿です。

JRadioButtonまたはJCheckBoxが選択されているかどうかを確認するために、isSelected()メソッドを呼び出すだけで、この非常に簡単なアプリケーションをコーディングする必要があります。これは、ButtonGroupをループして、そのgetSelection()メソッドを呼び出したくないことを意味します。

私のコードも、Tony Gaddisが作成した教科書のコードと同じです。これは、現在学習しているものです。Javaから始めて、制御構造からオブジェクトまで第4版

アプリケーションはエラーなしでコンパイルおよび実行されるため、これは論理的な問題です。

何が起こっているのか:

BagelsPanel、CoffeePanel、ToppingsPanel、およびGUIクラスのBagelAppの4つのクラスがあります。これらはすべて、JFrameを拡張するBagelAppクラスを除いてJPanelを拡張します。

このアプリの目的は、ユーザーがコーヒー、ベーグル、トッピングを選択して、すべての選択の合計価格を返すことができるようにすることです。問題は、$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;
}

上記は、isSelected()メソッドを呼び出してどのJRadioButtonが選択されているかを確認し、その価格をtotalに割り当てるBagelsPanelクラスのcalcBagel()メソッドです。以下は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クラス内のcalcBagel()メソッドでdouble変数totalを変更し、アプリケーションを実行してJRadioButton "Calculate"をクリックすると、JOptionPaneが正確に支えられ、合計が$ 1.06(最終的な二重変数TAXは0.06に設定されています)。

私が得ることができるどんな助けにも本当に感謝します。私はまだJavaの初心者であり、私のロジックが正しくない理由をよく理解していません。これは非常に些細なことかもしれませんが、私は本をチェックしましたが、コードは同じです。助言がありますか?

4

2 に答える 2

2

あなたの問題はここにあります、あなたのactionPerformed方法で:

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

表示されているパネルでメソッドを呼び出す代わりにcalcBagel(), calcCoffee(), calcToppings()、どこからともなく新しいパネルを作成し、それらに対して「calc-methods」を呼び出しています。もちろん、これらはユーザーがUIで操作しているオブジェクトとは異なるオブジェクトです。GUIに最初に追加したパネルへの参照を保持し、新しく作成されたオブジェクトではなく、それらに対して「calc-methods」を呼び出す必要があります。

PS:あなたのコードは本当にモデルとビューを混ぜ合わせています。

于 2012-05-06T08:17:23.797 に答える
1

実際のSSCCEがなければ、これに答えるのは少し難しいですが、これが私が行うことです。私のお気に入りのIDE(私の場合はNetbeans)を使用し、コードの先頭にブレークポイントを設定しcalcBagel()、コードを1行ずつステップ実行します。デバッガーを使用して、変数が設定されていることを確認します。

または、次のようにすることもできます。

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

これは、メソッドで何が起こっているのかを理解するための良い方法でもあります。あなたの問題はまた、この方法ではまったく簡単に起こらない可能性があります。しかし、これはそれを見つける方法になるでしょう。

于 2012-05-06T06:45:23.063 に答える