Java Swing开发中点击提交按钮后如何刷新JTable的展示数据?
问题根因分析
你当前代码存在两个核心问题导致JTable无法刷新:
- JTable没有和你创建的
DefaultTableModel绑定:初始化时你先创建了DefaultTableModel实例,但后续new JTable时传入的是原始的contents数组和header,没有关联已创建的model,所以对model做任何操作都不会同步到JTable上 DefaultTableModel是局部变量:你初始化时把model定义在方法内部,按钮事件监听的逻辑里无法访问到这个model实例,自然无法触发数据更新
修复步骤
第一步:修正JTable初始化逻辑,把model设为类成员变量
首先在你的GUI类中添加成员变量声明:
private DefaultTableModel tableModel;
然后修改初始化代码:
String header[] = {"material", "stack"}; String contents[][] = { {milk.getText(), dataFile.material.get(milk.getText())}, {vanila.getText(), dataFile.material.get(vanila.getText())}, {coffeebean1.getText(), dataFile.material.get(coffeebean1.getText())}, {coffeebean2.getText(), dataFile.material.get(coffeebean2.getText())}, {coffeebean3.getText(), dataFile.material.get(coffeebean3.getText())}, {choco.getText(), dataFile.material.get(choco.getText())}, {caramel.getText(), dataFile.material.get(caramel.getText())}, {icecream.getText(), dataFile.material.get(icecream.getText())}, {sweatMilk.getText(), dataFile.material.get(sweatMilk.getText())} }; // 初始化成员变量model tableModel = new DefaultTableModel(contents, header); // JTable绑定model table = new JTable(tableModel); JScrollPane scrollpane = new JScrollPane(table);
第二步:修改提交按钮监听逻辑,保存数据后刷新model
两种刷新方案可按需选择:
方案1:仅更新修改的指定行(性能更高)
仅修改目标材料对应行的库存值,适合单条数据修改的场景:
if(e.getSource()== submit){ // Error Handling if(viewSelection.getText().equals("Empty") || textField.getText().isBlank()) { JOptionPane.showMessageDialog(null, "Wrong Value"); }else { try { String targetMaterial = viewSelection.getText(); int newValue = Integer.parseInt(textField.getText()); dataFile.EditData(targetMaterial, dataFile.ReadData(), newValue); // 遍历找到对应材料的行,更新数值 for (int i = 0; i < tableModel.getRowCount(); i++) { if (targetMaterial.equals(tableModel.getValueAt(i, 0))) { tableModel.setValueAt(newValue, i, 1); break; } } JOptionPane.showMessageDialog(null, "Saved Data!"); } catch (IOException ioException) { ioException.printStackTrace(); } } }
方案2:全量刷新所有数据(适配批量变更场景)
如果修改后有多个数据同时变化,可以重新生成数组替换model的全部内容:
// 提交成功后执行全量刷新 String header[] = {"material", "stack"}; String newContents[][] = { {milk.getText(), dataFile.material.get(milk.getText())}, {vanila.getText(), dataFile.material.get(vanila.getText())}, {coffeebean1.getText(), dataFile.material.get(coffeebean1.getText())}, {coffeebean2.getText(), dataFile.material.get(coffeebean2.getText())}, {coffeebean3.getText(), dataFile.material.get(coffeebean3.getText())}, {choco.getText(), dataFile.material.get(choco.getText())}, {caramel.getText(), dataFile.material.get(caramel.getText())}, {icecream.getText(), dataFile.material.get(icecream.getText())}, {sweatMilk.getText(), dataFile.material.get(sweatMilk.getText())} }; tableModel.setDataVector(newContents, header);
注意:不需要手动调用
fireTableDataChanged(),DefaultTableModel的setValueAt、setDataVector方法会自动触发视图刷新,手动调用反而可能造成不必要的重绘。
内容的提问来源于stack exchange,提问作者Hodori
相关产品推荐
相关产品推荐

