2

どの JCheckBox が選択されたかを判断する必要があるプログラムに取り組んでいます。3 つの異なるボタン グループを使用していますが、そのうちの 2 つはテキストが重なっています。適切な料金 (COSTPERROOM と COSTPERCAR) を合計 (costOfHome) に追加できるように、どちらがイベントをトリガーしたかを判断できる必要があります。私が理解できないのは、テキストが同じ場合にチェックボックスのソースを区別する方法です。1 つのボタン グループのテキストを「1」「2」などの文字列に変更しようと考えていましたが、最初にチェックボックスを作成した方法に大きな問題が生じます。事前に感謝します。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JMyNewHome extends JFrame implements ItemListener {

    // class private variables
    private int costOfHome = 0;

    // class arrays
    private String[] homeNamesArray = {"Aspen", "Brittany", "Colonial", "Dartmour"};
    private int[] homeCostArray = {100000, 120000, 180000, 250000};

    // class constants 
    private final int MAXROOMS = 3;
    private final int MAXCARS = 4;
    private final int COSTPERROOM = 10500;
    private final int COSTPERCAR = 7775;

    JLabel costLabel = new JLabel();

    // constructor
    public JMyNewHome ()
    {
        super("My New Home");
        setSize(450,150);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Font labelFont = new Font("Time New Roman", Font.BOLD, 24);

        setJLabelString(costLabel, costOfHome);
        costLabel.setFont(labelFont);
        add(costLabel);

        JCheckBox[] homesCheckBoxes = new JCheckBox[homeNamesArray.length];
        ButtonGroup homeSelection = new ButtonGroup();
        for (int i = 0; i < homeNamesArray.length; i++)
        {
            homesCheckBoxes[i] = new JCheckBox(homeNamesArray[i], false);
            homeSelection.add(homesCheckBoxes[i]);
            homesCheckBoxes[i].addItemListener(this);
                add(homesCheckBoxes[i]);
        }

        JLabel roomLabel = new JLabel("Number of Rooms in Home");
        add(roomLabel);

        ButtonGroup roomSelection = new ButtonGroup();
        JCheckBox[] roomCheckBoxes = new JCheckBox[MAXROOMS];
        for (int i = 0; i < MAXROOMS; i++)
        {
            String intToString = Integer.toString(i + 2);
            roomCheckBoxes[i] = new JCheckBox(intToString);
            roomSelection.add(roomCheckBoxes[i]);
            roomCheckBoxes[i].addItemListener(this);
            add(roomCheckBoxes[i]);
        }

        JLabel carLabel = new JLabel("Size of Garage (number of cars)");
        add(carLabel);

        ButtonGroup carSelection = new ButtonGroup();
        JCheckBox[] carCheckBoxes = new JCheckBox[MAXCARS];
        for (int i = 0; i < MAXCARS; i++)
        {
            String intToString = Integer.toString(i);
            carCheckBoxes[i] = new JCheckBox(intToString);
            carSelection.add(carCheckBoxes[i]);
            carCheckBoxes[i].addItemListener(this);
            add(carCheckBoxes[i]);
        }

        setVisible(true);

    }

    private void setJLabelString(JLabel label, int cost)
    {
        String costOfHomeString = Integer.toString(cost);
        label.setText("Cost of Configured Home:  $ " + costOfHomeString + ".00");
        invalidate();
        validate();
        repaint();
    }

    public void itemStateChanged(ItemEvent e) {
        JCheckBox source = (JCheckBox) e.getItem();
        String sourceText = source.getText();
        //JLabel testLabel = new JLabel(sourceText);
        //add(testLabel);
        //invalidate();
        //validate();
        //repaint();
        for (int i = 0; i < homeNamesArray.length; i++)
        {
            if (sourceText == homeNamesArray[i])
            {
                setJLabelString(costLabel, costOfHome + homeCostArray[i]);
            }
        }
    }
}
4

2 に答える 2

3

私は...するだろう

  • これには JCheckBox ではなく JRadioButton を使用してください。これは、JCheckBox のセットではなく、1 つの選択のみを許可する JRadioButton のセットを持つことが GUI 標準であると考えているためです。
  • 「重複するテキスト」があるかもしれませんが、ボタンの actionCommand を好きなように設定できます。したがって、ボタンの 1 つのセットには、「部屋数 2」、「部屋数 3」などの actionCommand を含めることができます。
  • getSelection()さらに良いことに、ButtonGroup を呼び出すと、選択されたボタンの ButtonModel (または何も選択されていない場合は null) が取得されるため、どのトグル ボタン (チェック ボックスまたはラジオ ボタン) が選択されているかを ButtonGroup で知ることができます。次に、そのgetActionCommand()メソッドを介してモデルから actionCommand を取得できます。最初に、選択したモデルが null でないことを確認してください。
  • レイアウト マネージャーを使用すると、作業がはるかに簡単になります。

たとえば、2 つの ButtonGroup があるとします。

ButtonGroup fooBtnGroup = new ButtonGroup();
ButtonGroup barBtnGroup = new ButtonGroup();

これらの ButtonGroup に一連の JRadioButton を追加すると、どのボタンがどのグループに対して選択されたかを次のように確認できます (次のコードは JButton の ActionListener にあります)。

ButtonModel fooModel = fooBtnGroup.getSelection();
String fooSelection = fooModel == null ? "No foo selected" : fooModel.getActionCommand();

ButtonModel barModel = barBtnGroup.getSelection();
String barSelection = barModel == null ? "No bar selected" : barModel.getActionCommand();

System.out.println("Foo selected: " + fooSelection);
System.out.println("Bar selected: " + barSelection);

もちろん、ボタンに actionCommand を設定したと仮定します。

于 2011-09-24T22:12:47.333 に答える
0

チェックボックスには、他のスイングコンポーネントと同様にアイテムリスナーがあります。それらを切り離し、それぞれにリスナーを追加するだけです{

checkBox.addActionListener(actionListener); 

}

http://www.java2s.com/Code/Java/Swing-JFC/CheckBoxItemListener.htm

于 2011-09-24T23:09:52.477 に答える