JCheckBox在选中时不会更新

时间:2018-01-30 19:37:15

标签: java swing actionlistener jcheckbox

我正在使用JCheckBox来查找客户想要购买的内容,如果选择了JCheckBox(帽子),则总计+ = hatprice,但它不会更新总数。 我的代码:

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

public class NgaFillimi extends JFrame implements ActionListener{

    private JCheckBox hat;
    private JLabel thetotal;
    private int total = 0;

    public NgaFillimi() {

        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        hat = new JCheckBox("hat");
        thetotal = new JLabel("The total is " + total);

        hat.addActionListener(this);

        c.add(thetotal);
        c.add(hat);
    }

    @Override
    public void actionPerformed(ActionEvent evt) {
        if (hat.isSelected()) {
            total += 50;
        }
    }

    public static void main(String[] args) {
        NgaFillimi gui = new NgaFillimi();
        gui.setSize(300,200);
        gui.setVisible(true);
        gui.setDefaultCloseOperation(EXIT_ON_CLOSE);
        gui.setTitle("GUI");
    }

}

2 个答案:

答案 0 :(得分:2)

你正在遭受"神奇的思考"。是的,total变量 改变了,但JLabel的文本本身并没有因为总体变化而神奇地改变。 编码员必须自动更改,一旦更改了总计,就会在actionPerformed方法中重新调用thetotal.setText(...)

为什么你的代码不起作用?因为所有JLabel都知道它的文本被设置为一个字符串并且就是它。它显示的String对象永远不会改变(因为字符串是不可变的,所以也不会改变)。同样,JLabel更改其显示的唯一方法是显式调用其setText方法。

此外,如果你修改你的代码以便每次选择JCheckBox时JLabel都会适当更新,那么它就不会表现得很好,因为每次JCheckBox都被取消选中然后重新选中,总增量再次,这看起来并不正确。最好在取消选择JCheckBox时删除50,然后在选中时添加50。

  

我试图解释你说的话我已经修好了,但它变得消极了,因为我有一堆其他的JCheckBoxes

然后不要添加/减去,而是考虑给你的gui一个方法,比如叫sumAllCheckBoxes()并让所有JCheckBox监听器调用这个方法,无论它们是被选中还是未选中。该方法将总计 - total = 0;归零,然后遍历所有JCheckBox,如果选中JCheckBox则增加成本,例如:

public void sumAllCheckBoxes() {
    total = 0;
    if (someCheckBox.isSelected()) {
        total += someValue;
    }
    if (someOtherCheckBox.isSelected()) {
        total += someOtherValue;
    }

    // .... etc...

    // then set the text for theTotal here

}

最后它设置了JLabel。关键是要考虑您希望代码在程序的每个步骤中执行的操作。

答案 1 :(得分:0)

您尚未更新实际的JLabel。相反,您更新了total变量。要更新JLabel,您需要的代码为thetotal.setText("The total is " + total)