1

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

    }

但我怎样才能将 i,j 发送到函数buttonActionPerformed

4

4 回答 4

5

您可以为每个使用具体的ActionJButton并将值i&传递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) {
   // ...
}
于 2012-12-19T20:58:29.100 回答
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) {

}
于 2012-12-19T21:01:45.873 回答
2

有几种选择:

  • 您可以将事件的来源 ( ActionEvent#getSource()) 与数组中的按钮进行比较,并检索ij。缺点是你不断循环遍历数组
  • 您可以按照其他答案中的建议将iand传递j给 anAction或 theActionListener
  • 您可以使用JComponent#putClientPropertyandJComponent#getClientProperty方法将iand存储jJButton. JButton可以通过ActionEvent#getSource方法访问
于 2012-12-19T22:28:45.067 回答
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 的值传递给最终......它看起来很难看。

于 2012-12-19T23:06:55.490 回答