我的Swing项目中有很多复选框。对于每个复选框,选择/取消选择要执行的特定查询。我知道获取复选框来源的一种方法是
public void itemStateChanged(ItemEvent e) {
if(e.getSource=="checkbox object")
{
some code goes here;
}
}
如果我的复选框数量少于此解决方案是最好的,但如果我有很多复选框,那么我必须编写冗长的代码。有没有办法在单个命令中找到导致事件的复选框的对象?
答案 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;
}
}