如何使用JCheckBoxes选择?

时间:2011-02-18 18:11:28

标签: java swing jbutton jcheckbox

我在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");}
            }
     }}

5 个答案:

答案 0 :(得分:5)

我已经测试了这个简单的示例,它运行正常(当您选中复选框时会写"one has been selected",而当您取消选中时会"nothing"):

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();
    }
}

在您的示例中,似乎one在构造函数CheckList()中声明。您确定可以在内部类CheckBoxListener中访问它吗?

答案 1 :(得分: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);

你实际上是在构造函数中使用临时的“one”,这与你班级顶层的“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!

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

你有没看过这行

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

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