Java 选中时JCheckBox未更新
我使用JCheckBox来查找客户想要购买什么,如果选择了JCheckBox(hat),那么total+=hatprice,但它不会更新总数。 我的代码: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
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。你是一个传奇,谢谢你花时间来帮助我!