如何知道哪个JCheckBox发送了ItemEvent

时间:2013-01-15 07:35:15

标签: java swing events checkbox

我的Swing项目中有很多复选框。对于每个复选框,选择/取消选择要执行的特定查询。我知道获取复选框来源的一种方法是

public void itemStateChanged(ItemEvent e)  {
if(e.getSource=="checkbox object")
{ 
some code goes here; 
}
}

如果我的复选框数量少于此解决方案是最好的,但如果我有很多复选框,那么我必须编写冗长的代码。有没有办法在单个命令中找到导致事件的复选框的对象?

3 个答案:

答案 0 :(得分:5)

您可以像这样选择复选框

JCheckBox checkBox1 = new JCheckBox("Check1");
 JCheckBox checkBox2 = new JCheckBox("Check2");
 checkBox1.setName("Check1");
 checkBox2.setName("Check2");
 ItemListener listener = new ItemListener() {
    @Override
    public void itemStateChanged(ItemEvent e) {
        JCheckBox check = (JCheckBox)e.getSource();
         String name = check.getName();
         System.out.println(name);
    }
};
checkBox1.addItemListener(listener);
checkBox2.addItemListener(listener);

答案 1 :(得分:1)

如果您以一些统一的方式处理检查,将JChekBox es放入HashMap,将它们映射到某些结构(可能是数据源或某些处理对象)有助于处理事件更容易。通过创建,添加和注册复选框的方法,可以进一步减少代码量。一般的想法是沿着

HashMap<JCheckBox, String> urls = new HashMap<JCheckBox, String>();   
    // Here I use String but can be any complex data structure.

ActionListener listener = new ActionListener() {        
    public void actionPerformed(ActionEvent e) {
        String url = urls.get(e.getSource());
                    // Work with the selected URL now
    }
};

void buildCheckBoxes() {
    register("http://wikipedia.org");
    register("http://stackoverflow.com");
            // and 101 others, or load the list from the file.
}

void register(String url) {
    JCheckBox box = new JCheckBox("Use "+url);
    urls.put(box, url);
    box.addActionListener(listener);
             // One listener for all, defined above
    myPanel.add(box);
            // Some panel probably with GridLayout
}

另一方面,如果你的行为非常不同,那么为每个不同的行动设置一个单独的监听器(可能是内部或匿名类)也可能更好:

    JCheckBox boxA = new JCheckBox("A");
    JCheckBox boxB = new JCheckBox("B");

boxA.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
               // Only code for boxA
    }
});

boxB.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
               // Only code for boxB
    }
});

只要监听器中有更多代码,就应该将其移动到主类的方法中。

答案 2 :(得分:0)

如果您想知道哪个组件(CheckBox或任何其他组件)已在java中生成事件,您可以使用“setName(name)”方法为该组件指定名称。

// For CheckBox
JCheckBox checkBox1 = new JCheckBox();
checkBox1.setName("CheckBox1");

// Any other Component
JButton button1 = new JButton();
button1.setName("Button1");

现在,在侦听器类中,您可以获取已生成当前事件的源对象。

// CheckBox Listener
public void itemStateChanged(ItemEvent e)  
{
    JCheckBox source = (JCheckBox)e.getSource();

    if(source.getName().equals("CheckBox1"))
    { 
        //some code goes here; 
    }
}