1

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

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

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

4

3 回答 3

6

您可以像这样获得选中的复选框

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);
于 2013-01-15T08:04:13.660 回答
1

如果您以某种非常统一的方式处理检查,则将JChekBoxes 放入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
    }
});

一旦侦听器中有更多代码,您应该将其移动到主类的方法中。

于 2013-01-15T07:56:10.377 回答
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; 
    }
}
于 2013-01-15T08:20:51.147 回答