我有一个JButtons的2D数组
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中吗?
答案 0 :(得分:3)
ActionEvent
类有getSource()
方法用于获取生成事件的组件。
答案 1 :(得分:2)
最简单的方法是声明两个临时的最终整数,然后引用它们。
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);
}
});
}
答案 2 :(得分:2)
您可以设置JButton对象的“name”属性,根据mre的回答,您可以调用getSource()方法。所以你可以识别单击按钮
答案 3 :(得分:0)
另一个选择是让你的类实现ActionListner(即implements ActionListner
)。
然后当你循环循环中的按钮时,你可以说
ledBtns[i][j].addActionListener(this)
。
当然,您必须弄清楚哪个对象是事件的来源(通常使用if...else
块)。现在,对于64个对象来说可能会变得难以处理,但对于较少的项目,它通常不是问题。
或者,您可以使用actionPerformed
方法调用更改图像并传入按钮对象等来完成您的工作。
我建议的只是另一种选择。我会为你的代码做最有意义的事情,并且是最干净,最易读的。