[英]Multiple JButtons, one Eventlistener in Java
我有一个2D的JButton数组
JButton[][] ledBtns = new JButton[8][8];
然后循环执行所有初始化工作。 现在,我想向每个JButton添加一个EventListener,当单击Button os时将触发该事件。 然后,我想更改按钮上的图像。
for(int i = 0; i < ledBtns.length; i++){
for(int j = 0; j < ledBtns[i].length; j++){
//init stuff
ledBtns[i][j].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
changeImage();
}
});
}
}
现在将调用'changeImage()',但我需要知道调用它的按钮。 我不能使用参数,如果这样做会告诉我将它们声明为“ final”。 除了编写完全相同的64个方法并将它们手动添加到每个JButton中之外,还有其他方法吗?
ActionEvent
类具有用于获取生成事件的组件的getSource()
方法。
最简单的方法是声明两个临时的final整数,然后引用它们。
for(int i = 0; i < ledBtns.length; i++){
for(int j = 0; j < ledBtns[i].length; j++){
//init stuff
final int finalI = i;
final int finalJ = j;
ledBtns[i][j].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
changeImage(finalI,finalJ);
}
});
}
您可以设置JButton对象的“名称”属性,并根据mre的回答,可以调用getSource()方法。 这样您就可以点击身份确认按钮
另一个选择是让您的类实现ActionListner(即, implements ActionListner
)。
然后,当您循环浏览按钮时,您可以说ledBtns[i][j].addActionListener(this)
。
当然,那么您必须找出事件的源是哪个对象(通常使用if...else
块)。 现在,这对于64个对象可能变得笨拙,但是对于较小的项目,通常不是问题。
或者,您可以让actionPerformed
方法调用更改图像并传递按钮对象,等等来完成您的工作。
我建议的只是另一种选择。 我会做最适合您的代码,并且最干净,最易读的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.