2011-02-18 37 views
3

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

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

我已经测试了这个简单的例子,它完美的作品(写入"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访问吗?

+0

我有完全一样的格式。除非你有一个=新的JCheckBox(“执行CT扫描”); .................我有JCheckBox one =新的JCheckBox(“执行CT扫描”);当我删除'JCheckBox'它现在正在工作。有趣的是,我不知道,因为它没有工作。 – razshan

+0

实际上,您有两个名为'one'的JCheckBox:在Checklist类中定义的一个名称,在您的侦听器中引用,另一个(在右边)在构造函数Checklist()中定义。 – olivierlemasle

0

你需要在每一个复选框添加一个动作监听器,除了第七之一,它不具有任何影响),并重新计算按钮的启用状态每个监听器被调用时。见addActionListener

0

为了实现这一点,你会想一个方法,将检查所有你关心的案件时,所获得的状态采取相应的措施。然后为每个复选框分配一个ActionListener来调用这个工作方法。

0

你检查,如果该行

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

是确定的?尝试删除这个,看看它是否有帮助。 事件可能是一个真正的来源痛苦。

+0

删除此行,给出错误“线程中的异常”AWT-EventQueue-0“java.lang.NullPointerException – razshan

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

你有“一”,属于清单中的“私人JCheckBox的一个”和两份“JCheckBox的一个= ...”在你的构造函数中。然后你会发现,当你调用你实际上是使用在构造函数中暂时的“一”,这是不一样的

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

“一”在你的类的顶部!

现在,当你调用

if(e.getSource() == one) 
您现在使用

“一”在你的类,这是不是你在窗口中看到的复选框的顶部!

这就是为什么移除“JCheckBox的”让你的程序的工作 - 现在的“一个”在你的构造是一样的“一”在你班上名列前茅。

以使其更清晰,下面的代码是你真的做你的破例如什么:

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! 
+1

+1:用于定义问题。 –