选择 JCheckBox 时添加到变量

Add to a variable when a JCheckBox is selected

我需要编写一个允许用户在 JCheckBoxes 中选择保险选项的应用程序。选择 JCheckBox 后,我想将该选项的值添加到 "TotalPrice"。我将 totalPrice 初始化为 0,但是当我尝试在 "if" 语句中添加它时,没有任何反应。

package p3s4;

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

public class JInsurance extends JFrame implements ItemListener {
    //initialize variables.
    FlowLayout flow = new FlowLayout();
    int hmoPrice = 200;
    int ppoPrice = 600;
    int dentalPrice = 75;
    int visionPrice = 20;
    String decimal = ".00";
    DecimalFormat moneyFormat = new DecimalFormat(decimal);
    int totalPrice = 0;
    //initialize TextFields and CheckBoxes.
    JLabel heading = new JLabel("Choose insurance options: ");
    JCheckBox hmo = new JCheckBox("HMO");
    JCheckBox ppo = new JCheckBox("PPO");
    ButtonGroup providersGroup = new ButtonGroup();
    JCheckBox dental = new JCheckBox("Dental");
    JCheckBox vision = new JCheckBox("Vision");
    JTextField hmoSelection = new JTextField(hmo.getText() + " $" + moneyFormat.format(hmoPrice));
    JTextField ppoSelection = new JTextField(ppo.getText() + " $" + moneyFormat.format(ppoPrice));
    JTextField dentalSelection = new JTextField(dental.getText() + " $" + moneyFormat.format(dentalPrice));
    JTextField visionSelection = new JTextField(vision.getText() + " $" + moneyFormat.format(visionPrice));
    JTextField totalSelection = new JTextField("Total:  $" + totalPrice);

    public JInsurance() {
        super("Insurance Options");

        setLayout(flow);
        add(heading);
        providersGroup.add(hmo);
        providersGroup.add(ppo);
        add(hmo);
        add(ppo);
        add(dental);
        add(vision);
        add(totalSelection);
        add(hmoSelection);
        add(ppoSelection);
        add(dentalSelection);
        add(visionSelection);
        //Set visibility.
        hmoSelection.setVisible(false);
        ppoSelection.setVisible(false);
        dentalSelection.setVisible(false);
        visionSelection.setVisible(false);
        totalSelection.setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //add listeners.
        hmo.addItemListener(this);
        ppo.addItemListener(this);
        dental.addItemListener(this);
        vision.addItemListener(this);
    }

    public void itemStateChanged(ItemEvent event) {
        Object source = event.getSource();
        //Check if boxes are selected. If they are, add price of insurance
        //option to "totalPrice" TextField.
        if (source == hmo) {
            if (event.getStateChange() == ItemEvent.SELECTED) {
                totalPrice += 200;
                hmoSelection.setEditable(false);
                hmoSelection.setVisible(true);
                hmoSelection.getParent().revalidate();

            } else {
                totalPrice -= 200;
                hmoSelection.setVisible(false);
            }
        } else if (source == ppo) {
            if (event.getStateChange() == ItemEvent.SELECTED) {
                totalPrice += 600;
                ppoSelection.setEditable(false);
                ppoSelection.setVisible(true);
                ppoSelection.getParent().revalidate();
            } else {
                totalPrice -= 600;
                ppoSelection.setVisible(false);
            }
        } else if (source == dental) {
            if (event.getStateChange() == ItemEvent.SELECTED) {
                totalPrice += 75;
                dentalSelection.setEditable(false);
                dentalSelection.setVisible(true);
                dentalSelection.getParent().revalidate();
            } else {
                totalPrice -= 75;
                dentalSelection.setVisible(false);
            }
        } else {
            if (event.getStateChange() == ItemEvent.SELECTED) {
                totalPrice += 20;
                visionSelection.setEditable(false);
                visionSelection.setVisible(true);
                visionSelection.getParent().revalidate();
            } else {
                totalPrice -= 20;
                visionSelection.setVisible(false);
            }
        }
    }

    public static void main(String[] args) {
        JInsurance first = new JInsurance();
        final int WIDTH = 500;
        final int HEIGHT = 300;
        first.setSize(WIDTH, HEIGHT);
        first.setVisible(true);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        first.setLocation(dim.width / 2 - first.getSize().width / 2,
                dim.height / 2 - first.getSize().height / 2);
    }
}

您在 totalSelection JTextfield 中显示了 totalPrice 值,但您从未更新 JTextField 保存的文本。 Java 编译器和 JVM 非常愚蠢,只会按照您的指示去做。如果您希望更新文本,则必须在更新发生时在文本字段上显式调用 setText(...)

您需要自己更新 totalSelection 的文本。这是因为当你初始化它时,你提供了一个 String 对象,该对象是当时从 totalPrice 的值生成的。

因此要修复它,请在 itemStateChanged

末尾重置 totalSelection 的文本