我正在使用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");
}
}
答案 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)
。