2012-12-19 90 views
1

我有一個類Game和一個按鈕陣列buts,我想調用Game類fun(i,j)當任何buts [i] [j]被點擊,我試過像這樣:設置onclickListener爲陣列按鈕上的按鈕的最佳做法

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

回答

5

你可以用一個具體的Action每個JButton和值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) { 
    // ... 
} 
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

有幾種選擇:

  • 你可以比較的情況下(ActionEvent#getSource())與陣列中的按鈕源,並檢索ij。缺點是,你不斷循環陣列上
  • 你可以通過ij到任何一個Action或在其他答案建議
  • 可以使用JComponent#putClientPropertyJComponent#getClientProperty方法來存儲ij在該ActionListenerJButton。訪問JButton可以與ActionEvent#getSource方法
2

我最喜歡這樣的方式來完成將要拉設置的ActionListener到一個函數,並宣佈i和j決賽。所以,你會設置你的按鈕是這樣的:

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的值傳遞給總決賽......它看起來很醜。