使用JButton的actionListener向JTable添加一行

时间:2012-06-08 16:31:42

标签: java jtable jbutton actionlistener defaulttablemodel

以下是我尝试添加创建JButton的代码,它将向连接的JTable添加一行。

我的变量如下所示,创建了表格和tbm,但是在当前未显示的程序的另一部分中进行了初始化。这些都是实例变量。

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

这是使用actionlisteners创建JButtons的代码。

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运行的for循环将JTable和JButton组装到JPanel中,并将其放在相应的JFrame中。这里的问题是,当我按下按钮时,会触发错误的actionListener。例如,在第0帧中按“添加行”应该触发addRow [0],而是触发addRow [4]。

1 个答案:

答案 0 :(得分:1)

只要点击任何按钮,您就会在tables[currentUser]的表格中添加一行。当您单击按钮X时,听起来您想要向table[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并将表索引作为参数传递给构造函数来完成此任务,但这只是我。