0

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

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

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

这是使用动作侦听器创建 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 运行的 for 循环将 JTable 和 JButton 组装到 JPanel 中,并将其放入相应的 JFrame 中。这里的问题是,当我按下按钮时,会触发错误的 actionListener。例如,在第 0 帧中按下“Add Row”应该会触发 addRow[0],但会触发 addRow[4]。

4

1 回答 1

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并将表索引作为参数传递给构造函数来实现这一点,但这只是我。

于 2012-06-08T16:45:12.087 回答