2012-06-08 90 views
0

以下是我的代碼,用於添加創建JButton,它將向連接的JTable添加一行。通過使用JButton的actionListener添加一行到JTable

我的變量如下所示,表和tbm被創建,但是在當前未顯示的程序的另一部分被初始化。這些都是實例變量。

int currentUser = 0; 
JTable[] tables = new JTable[5]; 
DefaultTableModel[] tbm = new DefaultTableModel[5]; 
JButton[] addRow = new JButton[5] 

這是用actionlisteners創建JButton的代碼。

for(int i=0;i<tbm.length;i++) { 
addRow[i] = new JButton("Add Row"); 
selectionModel = tables[i].getSelectionModel(); 
currentUser=i; 
addRow[i].addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { 
Object[] temp = {"",""}; 
tbm[currentUser].addRow(temp); 
selectionModel.setSelectionInterval(tbm[currentUser].getRowCount()-1,tbm[currentUser].getRowCount()-1); 
}}); 
} 

我後來使用的用於從0-tables.length運行環組裝的JTable和JButton的成JPanel並把它在一個相應的JFrame。這裏的問題是,當我按下按鈕時,會觸發錯誤的actionListener。例如,按下第0幀中的「添加行」應觸發addRow [0],但會觸發addRow [4]。

+0

您的'ActionListener's將行添加到索引['currentUser']的'tables'中的'JTable'。那麼當你點擊按鈕時設置了什麼'currentUser'?我在你提供的代碼示例中看不到這一點。 –

+0

1)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 2)請爲代碼塊使用一致的邏輯縮進。 –

+0

@安德魯湯普森,會做!我不幸地使用記事本進行編程,所以我習慣了缺乏格式化。 – user1418454

回答

1

無論何時按下任何按鈕,您都會在表格中添加一行tables[currentUser]。這聽起來像你想添加一行到table[X]當你點擊按鈕X.這裏的快速和骯髒的方式做到這一點:

for(int i=0;i<tbm.length;i++) { 
    final int tblIdx = i; 
    addRow[i] = new JButton("Add Row"); 
    selectionModel = tables[i].getSelectionModel(); 
    currentUser=i; 
    addRow[i].addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Object[] temp = {"",""}; 
      tbm[tblIdx].addRow(temp); 
      selectionModel.setSelectionInterval(tbm[tblIdx].getRowCount()-1,tbm[tblIdx].getRowCount()-1); 
     } 
    }); 
} 

你不能直接傳遞i到您的匿名ActionListener,因爲它不是一個最終的變量,因此在循環的每次迭代開始時,會創建一個臨時最終變量tblIdx並將其設置爲當前的任何i

我個人會通過繼承ActionListener並將表索引作爲參數傳遞給構造函數來實現此目的,但這只是我自己。

+0

謝謝!我在for循環中設置了最終的int,它效果很好!我想用一個實例變量不是要走的路。 – user1418454

相關問題