Java 选中时JCheckBox未更新

Java 选中时JCheckBox未更新,java,swing,actionlistener,jcheckbox,Java,Swing,Actionlistener,Jcheckbox,我使用JCheckBox来查找客户想要购买什么,如果选择了JCheckBox(hat),那么total+=hatprice,但它不会更新总数。 我的代码: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class NgaFillimi extends JFrame implements ActionListener{ private JCheckBox hat; private

我使用JCheckBox来查找客户想要购买什么,如果选择了JCheckBox(hat),那么total+=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");
    }

}
你正遭受着“神奇思维”的折磨。是的,
total
变量是 改变了,但JLabel的文本不会因为完全改变而自行神奇地改变一旦总数被更改,编码人员必须通过在actionPerformed方法中重新调用total.setText(…)来自己更改它

为什么你的代码不起作用?因为JLabel只知道它的文本被设置为一个字符串,就这样。它显示的字符串对象从不更改(也不能更改,因为字符串是不可变的)。同样,JLabel更改其显示的唯一方法是显式调用其
setText
方法

此外,如果您修复了代码,使得JLabel在每次选择JCheckBox时都会相应地更新,那么它的行为将不会很好,因为每次取消选择JCheckBox然后重新选择时,总增量都会再次增加,这似乎不正确。最好在取消选中JCheckBox时删除50,然后在选中时再添加50



我试着按照你说的去做,现在我把它修好了,但是它变得消极了,因为我还有很多其他的JCheckbox

然后不要添加/减去,而是考虑给你的GUI一个方法,比如叫“代码> SUMALCHECKBOXESE())/>代码,并且所有的JCyBox侦听器都调用这个方法是检查还是不检查。该方法将归零总计--

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。关键是要仔细考虑在程序的每一步中你希望代码做什么。

你正遭受着“神奇思维”的折磨。是的,
total
变量是 改变了,但JLabel的文本不会因为完全改变而自行神奇地改变一旦总数被更改,编码人员必须通过在actionPerformed方法中重新调用total.setText(…)
来自己更改它

为什么你的代码不起作用?因为JLabel只知道它的文本被设置为一个字符串,就这样。它显示的字符串对象从不更改(也不能更改,因为字符串是不可变的)。同样,JLabel更改其显示的唯一方法是显式调用其
setText
方法

此外,如果您修复了代码,使得JLabel在每次选择JCheckBox时都会相应地更新,那么它的行为将不会很好,因为每次取消选择JCheckBox然后重新选择时,总增量都会再次增加,这似乎不正确。最好在取消选中JCheckBox时删除50,然后在选中时再添加50



我试着按照你说的去做,现在我把它修好了,但是它变得消极了,因为我还有很多其他的JCheckbox

然后不要添加/减去,而是考虑给你的GUI一个方法,比如叫“代码> SUMALCHECKBOXESE())/>代码,并且所有的JCyBox侦听器都调用这个方法是检查还是不检查。该方法将归零总计--

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。关键是要仔细考虑在程序的每个步骤中您希望代码执行的操作。

您尚未更新实际的
JLabel
。而是更新了
total
变量。要更新
JLabel
,您需要显示
total.setText(“总数为“+total”)
的代码,因为您尚未更新实际的
JLabel
。而是更新了
total
变量。要更新
JLabel
,您需要写有
total.setText(“total is”+total)

的代码。此外,您几乎可以肯定地将
gui.setSize(…)
移动到
gui.setTitle(…)
语句到构造函数中,使用引用作为
this
,您几乎可以肯定地将您的
gui.setSize(…)
语句移动到
gui.setTitle(…)
构造函数中,使用引用作为
this
。我正在尝试您所说的内容,现在我已经修复了它,但它变得消极了,因为我还有一堆其他JCheckbox。您是一个传奇,感谢您花时间帮助我!我正在尝试你说的话,现在我把它修好了,但是它变得消极了,因为我还有很多其他的JCheckbox。你是一个传奇,谢谢你花时间来帮助我!