为数组按钮上的按钮设置onclickListener的最佳实践

Wil*_*aan 1 java arrays swing jbutton actionlistener

我有一个类Game和一组按钮buts,我想fun(i,j)在点击任何buts [i] [j]时调用Game类的函数,我试着这样:

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) {

    }
Run Code Online (Sandbox Code Playgroud)

但是我如何将i,j发送给函数buttonActionPerformed

Rei*_*eus 5

你可以用一个具体的行动为每个JButton并传入值ij到类的构造函数.

添加:

buts[i][j].setAction(new MyAction(i, j));
Run Code Online (Sandbox Code Playgroud)

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

和:

private void buttonActionPerformed(ActionEvent evt, int i, int j) {
   // ...
}
Run Code Online (Sandbox Code Playgroud)