讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 Java Swing 中通过替换全部数据实现 JTable 手动排序

夏丽吖_6386

夏丽吖_6386

发布时间:2026-01-28 09:53:03

|

433人浏览过

|

来源于php中文网

原创

如何在 Java Swing 中通过替换全部数据实现 JTable 手动排序

本文介绍如何在不依赖 tablerowsorter 的前提下,通过完全替换 jtable 的底层数据模型(defaulttablemodel)来实现基于自定义算法(如冒泡排序)的表格行级重排,并确保排序结果可持久化到文本文件。

在 Swing 应用中,若需对 JTable 实施可控、可持久化的手动排序(例如按薪资升序),核心思路是:不操作视图层的显示逻辑,而是重新构建并设置整个表格的数据模型。这是因为 TableRowSorter 仅改变渲染顺序,底层 TableModel 的行序不变,导致保存时无法反映真实排序状态;而直接替换 TableModel 则能确保内存数据、界面显示与文件存储三者严格一致。

✅ 正确做法:重建 DefaultTableModel 并重设给 JTable

在你的 actionPerformed 方法中,当点击“Sort List”按钮后,你已成功调用 BubbleSort(arr) 获取有序的 ArrayList<Employee>。接下来,需将该有序列表转换为二维对象数组,并用其初始化一个新的 DefaultTableModel,最后通过 j.setModel(...) 替换原模型:

else if (e.getSource() == sortButton) {
    if (users.size() > 1) {
        ArrayList<Employee> arr = new ArrayList<>(users); // 简洁复制
        arr = BubbleSort(arr);

        // 1. 将排序后的 Employee 列表转为 Object[][] 数据
        Object[][] sortedData = new Object[arr.size()][3];
        for (int i = 0; i < arr.size(); i++) {
            Employee e = arr.get(i);
            sortedData[i][0] = e.getFirstName();
            sortedData[i][1] = e.getLastName();
            sortedData[i][2] = e.getSalary();
        }

        // 2. 定义列名(保持与原表一致)
        String[] columnNames = { "FName", "LName", "Salary" };

        // 3. 创建新模型并设给 JTable → 关键一步!
        DefaultTableModel newModel = new DefaultTableModel(sortedData, columnNames);
        j.setModel(newModel); // ✅ 替换整个模型,界面立即刷新

        // 4. 同步更新 users 和持久化(你已有 updateList,可复用)
        users.clear();
        users.addAll(arr);
        updateList(users);
    } else {
        JOptionPane.showMessageDialog(this, "Too Few Employees.", "Error", JOptionPane.ERROR_MESSAGE);
    }
}
⚠️ 注意事项:不要调用 model.setRowCount(0) 或逐行 addRow():这会破坏性能且易出错;整表替换更安全、高效。确保列数与 columnNames 严格匹配,否则 DefaultTableModel 构造会抛异常。j.setBounds(...) 是无效的(JTable 在 JScrollPane 内由布局管理器控制),建议移除或改用 setPreferredScrollableViewportSize 提升体验。若后续需支持多字段排序(如先按姓氏、再按薪资),只需修改 BubbleSort 的比较逻辑即可,模型重建方式不变。

? 补充:优化 BubbleSort(避免重复遍历)

当前冒泡排序存在冗余比较(j < arr.size()-1 未随外层循环优化)。推荐改进为:

public static ArrayList<Employee> BubbleSort(ArrayList<Employee> arr) {
    int n = arr.size();
    ArrayList<Employee> sorted = new ArrayList<>(arr); // 避免修改原集合
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) { // 每轮后最大值已就位,减少范围
            if (sorted.get(j).getSalary() > sorted.get(j + 1).getSalary()) {
                Collections.swap(sorted, j, j + 1);
            }
        }
    }
    return sorted;
}

✅ 总结

手动排序 JTable 的本质是数据驱动视图更新:

立即学习“Java免费学习笔记(深入)”;

  1. 对业务对象(Employee)列表执行排序;
  2. 将排序结果映射为 Object[][] 表格数据;
  3. 用新数据构造 DefaultTableModel;
  4. 调用 JTable.setModel() 全量替换——这是最简洁、可靠、符合 MVC 思想的方案。
    此方法完全绕过 TableRowSorter 的视图/模型分离陷阱,确保每一次“排序”都真实改变底层数据顺序,从而天然支持文件同步与后续 CRUD 操作的一致性。

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1138

2023.09.04

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

6076

2023.08.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

0

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

0

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

0

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

0

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

0

2026.10.22

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn