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

时间:2012-12-19 20:49:24

标签: java arrays swing jbutton actionlistener

我有一个类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

4 个答案:

答案 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())与数组中的按钮进行比较,然后检索ij。缺点是你继续循环遍历数组
  • 您可以将ij传递给其他答案中建议的ActionActionListener
  • 您可以使用JComponent#putClientPropertyJComponent#getClientProperty方法在i中存储jJButton。可以使用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的值传递给决赛...它只是看起来很难看。