如何实现点击按钮将JTable行单元格值复制到另一个JTable
问题根因
你的代码存在3个逻辑错误,直接导致行重复、值错位:
- 行数变量
mainTRow定义在按钮点击监听器外部,只会在界面初始化时赋值一次,后续mainTable新增/删除行时这个变量不会更新,点击按钮时取到的不是主表实时行数。 - 循环内部重复执行
mdl1.setRowCount(mainTRow)属于无效冗余操作,且在设置目标表固定行数后又调用addRow()方法——addRow()的逻辑是在表格现有行的末尾追加新行,每循环1次就多追加1行,直接导致目标表行数翻倍、重复添加行。 - 同一次循环中同时使用
addRow()和setValueAt()对同一列赋值,属于重复操作,还会因为addRow()改变行的实际索引,导致单元格值重复、错位。
修正后代码
直接替换原有按钮事件逻辑即可:
JButton totBTN = new JButton("Total"); totBTN.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DefaultTableModel mainModel = (DefaultTableModel)mainTable.getModel(); DefaultTableModel showModel = (DefaultTableModel)showTable.getModel(); // 每次点击时获取主表实时行数,先清空目标表原有旧数据 int realRowCount = mainModel.getRowCount(); showModel.setRowCount(0); // 逐行读取主表第一列值,追加到目标表,不需要重复设置行数、重复赋值 for(int i = 0; i < realRowCount; i++) { showModel.addRow(new Object[] {mainModel.getValueAt(i, 0)}); } } }); totBTN.setBounds(365, 341, 89, 23); mainPanel.add(totBTN);
如果需要复制主表多列数据到目标表,只需要在addRow的Object数组中按列索引追加取值即可,例如要复制前3列就写成new Object[] {mainModel.getValueAt(i, 0), mainModel.getValueAt(i, 1), mainModel.getValueAt(i, 2)}。
内容的提问来源于stack exchange,提问作者muybien
相关产品推荐
相关产品推荐

