1

クラスGameとボタンの配列があります。buts[i][j]がクリックされたときbutsにGameクラスの関数を呼び出したいので、次のように試しました。fun(i,j)

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

それぞれに具体的なアクションJButtonを使用して、値ijクラスのコンストラクターに渡すことができます。

追加:

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())を配列内のボタンと比較し、とを取得iできますj。欠点は、配列をループし続けることです
  • 他の回答で提案されているように、またはのいずれかにi渡すことができますjActionActionListener
  • JComponent#putClientPropertyおよびメソッドを使用して、およびをJComponent#getClientPropertyに格納できます。にアクセスするには、メソッドを使用して行うことができますijJButtonJButtonActionEvent#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);
        }
    });
}

追加のメソッドなしでこれらすべてを行うこともできますが、その後、いくつかのfinal int変数を宣言し、iとjの値をfinalsに転送する必要があります...それは見苦しいだけです。

于 2012-12-19T23:06:55.490 に答える