You need to enable JavaScript to run this app. Java Swing开发中点击提交按钮后如何刷新JTable的展示数据?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 07:54:02