我有一个类Game
和一组按钮buts
,我想在点击任何buts [i] [j]时调用Game类fun(i,j)
上的函数,i试过这样:
buts = new JButton[Setting.length][Setting.width];
Game game = new Game(setting);
int hgap = 4, vgap = 4;
panel = new JPanel(new GridLayout(Setting.length, Setting.width, hgap, vgap));
for (int i = 0; i < Setting.length; i++) {
for (int j = 0; j < Setting.width; j++) {
//JButton btn = new JButton();
buts[i][j] = new JButton();
buts[i][j].setText(String.valueOf(j));
setColor(buts[i][j], Game.cells[i][j].getColor());
buts[i][j].addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonActionPerformed(evt);
}
});
panel.add(buts[i][j]);
}
}
private void buttonActionPerformed(ActionEvent evt) {
}
但是如何将i,j发送到函数buttonActionPerformed
?
答案 0 :(得分:5)
您可以为每个JButton
使用具体的Action,并传递值i
&amp; j
进入类的构造函数。
<强>添加:强>
buts[i][j].setAction(new MyAction(i, j));
Action
实施:
class MyAction extends AbstractAction {
private final int iValue;
private final int jValue;
public MyAction(int i, int j) {
this.iValue = i;
this.jValue = j;
}
@Override
public void actionPerformed(ActionEvent e) {
buttonActionPerformed(e, iValue, jValue);
}
}
并强>
private void buttonActionPerformed(ActionEvent evt, int i, int j) {
// ...
}
答案 1 :(得分:3)
class MyActionListener implemments ActionListener{
private final int i;
private final int j;
MyActionListener (int i, int j){
this.i = i;
this.j = j;
}
}
buts[i][j].addActionListener(new MyActionListener(i,j) {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonActionPerformed(evt,this.i,this.j);
}
});
private void buttonActionPerformed(ActionEvent evt,int i,int j) {
}
答案 2 :(得分:2)
有几种选择:
ActionEvent#getSource()
)与数组中的按钮进行比较,然后检索i
和j
。缺点是你继续循环遍历数组i
和j
传递给其他答案中建议的Action
或ActionListener
JComponent#putClientProperty
和JComponent#getClientProperty
方法在i
中存储j
和JButton
。可以使用JButton
方法ActionEvent#getSource
答案 3 :(得分:2)
我最喜欢这样做的方法是将actionListener设置为函数,然后声明i和j final。所以你要设置这样的按钮:
for (int i = 0; i < Setting.length; i++) {
for (int j = 0; j < Setting.width; j++) {
//JButton btn = new JButton();
buts[i][j] = new JButton();
buts[i][j].setText(String.valueOf(j));
setColor(buts[i][j], Game.cells[i][j].getColor());
setButtonAction(buts[i][j], i, j);
panel.add(buts[i][j]);
}
}
并声明方法setButtonAction
,如下所示:
public void setButtonAction(JButton button, final int i, final int j){
button.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
fun(i,j);
}
});
}
你也可以在没有额外方法的情况下完成所有这些,但是你必须声明一些最终的int变量并将i和j的值传递给决赛...它只是看起来很难看。