我的 Swing 项目中有许多复选框。对于每个复选框选择/取消选择一个特定的查询将被执行。我知道获取复选框来源的一种方法是
public void itemStateChanged(ItemEvent e) {
if(e.getSource=="checkbox object")
{
some code goes here;
}
}
如果我的复选框数量比这个解决方案最好,但如果我有很多复选框,那么我必须编写冗长的代码。有没有办法在单个命令中找到导致事件的复选框对象?
您可以像这样获得选中的复选框
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);
如果您以某种非常统一的方式处理检查,则将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
}
});
一旦侦听器中有更多代码,您应该将其移动到主类的方法中。
如果您想知道哪个组件(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;
}
}