3

我在 JFrame 上有一个复选框。当我检查它时,我想在命令窗口上显示它已被选中。下面是我正在使用的代码。它编译和执行没有错误,但是当我选择复选框时,我没有在窗口上看到“一个已被选中”。

 public Checklist() {

    ...

    JCheckBox one = new JCheckBox("CT scan performed");
    one.addItemListener(new CheckBoxListener());

    }
        private class CheckBoxListener implements ItemListener{
        public void itemStateChanged(ItemEvent e)
        {
        if(e.getSource()==one){ if(one.isSelected()){
        System.out.println("one has been selected");
            }
            else{System.out.println("nothing");}
            }
     }}
4

5 回答 5

5

I have tested this simple example and it works perfectly (it writes "one has been selected" when you select the checkbox, and "nothing" when you deselect it):

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

public class Example extends JFrame{
    public JCheckBox one;

    public Example() {
        one = new JCheckBox("CT scan performed");
        one.addItemListener(new CheckBoxListener());
        setSize(300,300);
        getContentPane().add(one);
        setVisible(true);
    }

    private class CheckBoxListener implements ItemListener{
        public void itemStateChanged(ItemEvent e) {
            if(e.getSource()==one){
                if(one.isSelected()) {
                    System.out.println("one has been selected");
                } else {System.out.println("nothing");}
            }
        }
    }

    public static void main(String[] args) {
        new Example();
    }
}

In your example, it seems that one is declared in the constructor CheckList(). Are you sure that it can be accessed in the inner class CheckBoxListener?

于 2011-02-21T19:13:34.273 回答
4

您可能没有意识到您的程序中实际上有两个复选框!

我假设您的课程看起来像这样:

public class Checklist extends JFrame {
    private JCheckBox one;

    public Checklist() {
        JCheckBox one = new JCheckBox("CT scan performed");
        one.addItemListener(new CheckBoxListener());
        this.add(one);
    }
}

您有两个“one”副本,属于 Checklist 的“private JCheckBox one”和构造函数中的“JCheckBox one = ...”。然后你会注意到,当你打电话

one.addItemListener(new CheckBoxListener());
this.add(one);

您实际上是在构造函数中使用临时的“一”,它与类顶部的“一”不同!

现在,当你打电话

if(e.getSource() == one)

您现在正在使用班级顶部的“一”,这不是您在窗口中看到的复选框!

这就是为什么删除“JCheckBox”会使你的程序工作——现在你的构造函数中的“one”与类顶部的“one”相同。

为了更清楚地说明这一点,以下代码是您在损坏的示例中真正要做的:

public class Checklist extends JFrame {
    private JCheckBox one;

    public Checklist() {
        JCheckBox anotherOne = new JCheckBox("CT scan performed");
        anotherOne.addItemListener(new CheckBoxListener());
        this.add(anotherOne);
    }
}

...

if(e.getSource() == one)  //not equal to anotherOne!
于 2011-02-22T02:40:25.883 回答
0

你有没有检查过这条线

if(e.getSource()==one){

好吗?尝试删除它,看看它是否有帮助。事件可能是真实来源的痛苦。

于 2011-02-21T19:25:07.140 回答
0

您需要在除第七个之外的每个复选框上添加一个动作侦听器,这没有任何影响),并在每次调用侦听器时重新计算按钮的启用状态。见addActionListener

于 2011-02-18T18:18:48.200 回答
0

为了实现这一点,您将需要一种方法来检查您关心的所有情况并在达到状态时采取适当的措施。然后为调用这个工作方法的每个复选框设置一个 ActionListener。

于 2011-02-18T18:19:34.783 回答