首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在用户对JTable进行排序时跟踪行索引?

在用户对JTable进行排序时,可以通过以下步骤来跟踪行索引:

  1. 创建一个自定义的TableModel类,继承自DefaultTableModel,并重写getColumnClass和isCellEditable方法。这样可以确保JTable正确地处理数据类型和可编辑性。
  2. 在自定义的TableModel类中,添加一个额外的列来保存原始数据的索引。可以使用一个整数数组或者一个包含索引的对象数组来实现。
  3. 在getTableData方法中,返回原始数据的索引列。这样可以确保排序后的数据与原始数据的索引保持一致。
  4. 在JTable的构造函数中,使用自定义的TableModel类来创建表格模型。
  5. 为JTable添加一个排序监听器,当用户点击表头进行排序时,触发监听器的事件。
  6. 在排序监听器中,获取排序后的行索引,并更新自定义的TableModel类中保存的索引列。
  7. 在需要使用行索引的地方,可以通过调用JTable的convertRowIndexToModel方法将视图索引转换为模型索引。

下面是一个示例代码:

代码语言:java
复制
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import java.awt.*;
import java.util.Arrays;

public class JTableSortExample extends JFrame {
    private JTable table;
    private MyTableModel tableModel;

    public JTableSortExample() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(400, 300));

        // 创建自定义的TableModel
        tableModel = new MyTableModel();

        // 创建JTable并设置表格模型
        table = new JTable(tableModel);

        // 添加排序监听器
        TableRowSorter<TableModel> sorter = new TableRowSorter<>(tableModel);
        table.setRowSorter(sorter);
        sorter.addRowSorterListener(e -> {
            // 获取排序后的行索引
            int[] indexes = table.getSelectedRows();
            // 更新自定义TableModel中的索引列
            tableModel.updateIndexes(indexes);
        });

        JScrollPane scrollPane = new JScrollPane(table);
        getContentPane().add(scrollPane);

        pack();
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JTableSortExample example = new JTableSortExample();
            example.setVisible(true);
        });
    }

    private static class MyTableModel extends DefaultTableModel {
        private Object[][] data = {
                {"John", "Doe", 30},
                {"Jane", "Smith", 25},
                {"Bob", "Johnson", 35},
                {"Alice", "Williams", 28}
        };

        private int[] indexes = {0, 1, 2, 3};

        private String[] columnNames = {"First Name", "Last Name", "Age"};

        public MyTableModel() {
            super();
            setDataVector(data, columnNames);
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return getValueAt(0, columnIndex).getClass();
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            return false;
        }

        public void updateIndexes(int[] indexes) {
            this.indexes = indexes;
        }

        public int getModelIndex(int viewIndex) {
            return indexes[viewIndex];
        }
    }
}

这个示例代码演示了如何在用户对JTable进行排序时跟踪行索引。自定义的TableModel类中添加了一个额外的索引列,通过排序监听器来更新索引列的值。在需要使用行索引的地方,可以通过调用JTable的convertRowIndexToModel方法将视图索引转换为模型索引。

请注意,这只是一个简单的示例,实际应用中可能需要根据具体需求进行适当的修改和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java Swing JTable

设计使用JTable的应用程序时,值得密切注意将代表表数据的数据结构。 DefaultTableModel是一个模型实现,它使用对象矢量向量存储单元格值。...重要的是要记住,由各种JTable方法返回的列和索引是根据JTable(视图)而言的,不一定与模型使用的索引相同。...默认情况下,列可能会在JTable中重新排列,以使视图的列以与模型中的列不同的顺序出现。这一点根本不影响模型的实现:进行重新排序时JTable在内部维护列的新顺序并在查询模型之前转换其列索引。...同样,使用RowSorter提供的排序和筛选功能时,底层的TableModel不需要知道如何进行排序,而是由RowSorter进行处理。...这是一个重要的区别,因为当用户重新排列表中的列时,视图中给定索引处的列将发生变化。同时,用户的操作永远不会影响模型的列顺序。 ?

5K10

java winform开发之JTable全攻略

添加标识,如id等;4)怎样JTable中动态添加新;     1)JTable的基本用法: 我用的IDE是NetBeans,由于也是简单做几个页面的客户端,主要还是Web开发的,所以暂时不打算深究...,然后右击,选择“表内容”就可以进行表格的和列的编辑了,不过通常情况下,表格的内容都是动态生成的,所以控件上直接编辑它的内容的意义是不大的,当然,做DEMO时比较有用。...@Override public boolean isCellEditable(int row,int column){ //只允许用户第四列的数据进行编辑...,当然,表格中新增一远不止上面示例代码这么简单的,起码,大部分情况下是需要对标识进行比对,看是否存在关键字相同的一再作处理,像我所做的商品添加操作,如果请求新添加的商品项已经存在于表格中,那么事实上只需要将表格中相应商品行的数量加一就可以了...,如果之前并没存在该商品项的情况下,再进行新增一的操作。

1.2K30
  • 如何在Java中使用Table

    大家好,我是小面,今天给大家分享一下java中如何运用Table。 Java中,表用于将数据排列成列和。列是表中水平排列的空间,而行是表中垂直排列的空间。...列和之间的交点称为单元格,用于保存单条数据。 Java中,开发人员可以使用JTable方法在其应用程序中创建表。JTable是从JComponent类继承的Swing组件。...以下是如何使用数组Java中创建表: JTable(Object[][] rowData, Object[] columnNames) 下面是一些示例代码,展示了如何用Java创建一个表并填充数据:...如果您只是向用户展示数据,这不是一个特别理想的功能。此外,用户演示时,所有数据都被视为字符串。 另一个值得关注的问题是,如果您在数据库对象中查询特定值,则必须将所有值复制到数组或向量中。...(2).setPreferredWidth(200); 小结 本编程教程中,程序员学习了如何使用JTable或表模型Java中创建表。

    2.1K40

    java swing项目桌面软件还是蛮香的,至少有了我自己的桌面软件|Java 开发实战

    //表格的列,需要用户自己设定好private int column;//待加载的数据 数据每行的列数和上面要统一好private List list;public MyTableModel...显示模块去刷新从1-6的所有数据,所以说比如你更新了第一的数据,而你用的两个参数是1,4.那么恭喜你,你的更新JTable无法实现,因为他只更新从第二开始到第五的数据。...$BooleanRenderer"); }源码中就有渲染器专门处理bool类型的,那么我们只需要在getColumnClass进行处理就行了,我们的bool的单元格返回bool类JTable就会采用...设置完了编辑器,我们最终要是只渲染器,就是JTable最终如何显示的问题。和上面的那个一样。...继承TableCellRenderer类,通过getTableCellRendererComponent方法返回渲染成设么控件,渲染的控件我们可以进行二次封装。

    33810

    java swing 添加 jcheckbox复选框

    而一般情况使用JTable(Vector rowData,Vector columnNames)       Java方法中,如果参数需要传递接口,可以调用方法时传递一个(匿名)对象,该对象是一个不具名的类的实例...详细说明之前先解释一下JTable的显示原理:       首先是数据来源,您使用JTable的构造方法,大部分重载中参数即包含了数据,比如JTable(VectorrowData, Vector columnNames...其次是表格样式,表格将数据和如何显示数据(比如列数量、列名称、是否可编辑)保存在其数据模版中,该模版实现自接口TableModel。   最后,表格(每一个单元格)可以设置渲染效果。...(new DefaultTableModel(new Object[][]{{"第一"},{"第二"},{"第三"},{"第四"}}, new String[]{"测试行1","测试行2"}){...Ctrl键或者鼠标按住拖过连续的需要选中的,应该给用户说明 113 111 // 第一种方法是被推荐的,因为它具有选中的高亮显示,界面能更加友好 114 112 table.setSize

    3.3K00

    java超市仓库管理系统(超市条形码管理系统)

    5、获取选定索引值,参考代码如下: int index=table.getSelectedRow();//table为表格对象 获取选定的商品名称,参考代码如下: table.getValueAt...(index,1);//index为选定索引值 6、在编写代码时,最好用方法对重复使用的代码进行封装,尽量减少代码的冗余; 7、编译程序,并运行。...五、注意事项 A、仔细审题,把题目要求理解准确; B、请注意按照的界面的设计要求来进行窗体设计; C、请注意代码的书写、命名符合规范和适当的注释; 评分标准:超市管理系统—商品管理(查询及删除商品)...this.setResizable(false);//让窗口大小不可改变 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//用户单击窗口的关闭按钮时程序执行的操作...(jTable.getValueAt(jTable.getSelectedRow(), 2).toString()); String price = jTable.getValueAt(jTable.getSelectedRow

    3.5K20

    Solr搜索问题笔记(一)

    第二种是面向对象的形式将一份索引映射成一个Bean对象封装。...因为基本类型,类实例化时候,是会初始化赋值的,这样一来,无论你添加的某条数据(Document)里,有没有这个field,那么它都会生成一个值为初始化的field,这样以来,序时候就可能会出现问题...,比如按照某个成立日期升序,有些记录里的没有这个字的,而你又用了基本类型,那么添加到索引里面,就会出现一个成立日期为0的数据,这样以来,排序自然就排到了第一位,所以需要根据业务,进行适当调整。...引用类型的字段,如果为null,则此条记录不会生成filed (2):序时,对于那些没有值的field,我们应该如何控制其排序方式?...):如何在linux终端,执行curl命令清空某个core索引: Java代码 curl http://localhost:8983/solr/corename/update?

    88640

    Pandas Sort:你的 Python 数据排序指南

    多列上 DataFrame 进行排序 按升序按多列排序 更改列排序顺序 按降序按多列排序 按具有不同排序顺序的多列排序 根据索引 DataFrame 进行排序 按升序按索引排序 按索引降序排序 探索高级索引排序概念...本教程结束时,您将知道如何: 按一列或多列的值Pandas DataFrame进行排序 使用ascending参数更改排序顺序 通过index使用 DataFrame 进行排序.sort_index...查看突出显示的索引,您可以看到的顺序不同。这是因为quicksort不是稳定的排序算法,而是mergesort。 注意: Pandas 中,kind当您对多个列或标签进行序时会被忽略。...请注意索引如何没有特定顺序的。...探索高级索引排序概念 在数据分析中有很多情况您希望对分层索引进行排序。你已经看到了如何使用make和modelMultiIndex。对于此数据集,您还可以将该id列用作索引

    14.2K00

    python100G以上的数据进行排序,都有什么好的方法呢

    本教程中,您将学习如何使用.sort_values()和.sort_index(),这将使您能够有效地 DataFrame 中的数据进行排序。...本教程结束时,您将知道如何: 按一列或多列的值Pandas DataFrame进行排序 使用ascending参数更改排序顺序 通过index使用 DataFrame 进行排序.sort_index...查看突出显示的索引,您可以看到的顺序不同。这是因为quicksort不是稳定的排序算法,而是mergesort。 注意: Pandas 中,kind当您对多个列或标签进行序时会被忽略。...请注意索引如何没有特定顺序的。...探索高级索引排序概念 在数据分析中有很多情况您希望对分层索引进行排序。你已经看到了如何使用make和modelMultiIndex。对于此数据集,您还可以将该id列用作索引

    10K30

    MySQL入门详解(二)---mysql事务、锁、以及优化

    比如说,一个商城系统中,用户执行购买操作,那么用户订单中应该加一条,库存要减一条,如果这两步由于意外只进行了其中一步那么就会发生很大的问题。而事务可以很好的解决这个问题。...该事物就要等待锁释放 级锁特点:innoDB锁是通过给索引上的索引项加锁来实现的,只有通过索引条件(例如id)检索数据,innoDB才使用级锁,佛则将使用表锁;意向锁是innoDB自动加的,不需要用户干预...FOR UPDATE #主动添加独占锁(X) #释放锁 commit;或 rollback; 当使用排他锁写数据时,其他人无法操作本条数据; 当给一条数据添加了它锁,其他人这条数据没有任何权限,...但并不影响其他人其他数据操作; InnoDB默认的隔离方式下,操作者不提交,操作数据只保存在内存里,另一用户可以查询,查询到的是旧值; 即使字段家里索引使用时自己变了类型,索引失效会加表锁; 间隙锁...Not exists:MySQL能够查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的后,不再为前面的的组合在该表内检查更多的

    1.1K50

    MySQL 之 JSON 支持(三)—— JSON 函数

    返回 JSON 值的函数总是这些值执行规范化(参阅“JSON 值的规范化、合并和自动封装”),然后它们进行排序。... WHERE 子句中使用 JSON_OVERLAPS() InnoDB 表的 JSON 列进行查询可以使用多值索引进行优化。多值索引,提供了详细信息和示例。...参数,参数值执行时可能是常量,但在编译时不是。 search_str 和 path 始终被解释为 utf8mb4 字符串,而不管它们的实际编码如何。...JSON 列进行间接索引的信息,参阅 为生成列创建索引以提供 JSON 列索引。...WHERE 子句中使用 MEMBER OF() InnoDB 表的 JSON 列进行查询可以使用多值索引进行优化。有关详细信息和示例,参阅 多值索引

    62710

    SQL Server数据库高级进阶之锁实战演练

    并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的完整性和一致性。当事务在对某个数据对象进行操作前,先向系统发出请求,其加锁。加锁后事务就该数据对象有了一定的控制。...•  它锁 (X) (Exclusive (X) Locks) 用于数据修改操作,例如INSERT、UPDATE或DELETE。确保不会同时同一资源进行多重更新。...3)、它锁 (X) 它锁 (X) (Exclusive (X) Locks) 用于数据修改操作,例如INSERT、UPDATE或DELETE。确保不会同时同一资源进行多重更新。...根据查询条件创建合适的索引,最大化提升索引查找的效率,此优化的一个目标是使索引查找返回尽可能少的,以最小化查询的的成本。...六、如何预防死锁  首先要理解,多并发的环境中死锁是不可避免的,只能通过合理的数据库设计、良好的索引、适当的查询语句以及隔离等级等措施尽量减少死锁。

    1.1K40

    SQL Server数据库高级进阶之锁实战演练

    并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的完整性和一致性。当事务在对某个数据对象进行操作前,先向系统发出请求,其加锁。加锁后事务就该数据对象有了一定的控制。...• 它锁 (X) (Exclusive (X) Locks) 用于数据修改操作,例如INSERT、UPDATE或DELETE。确保不会同时同一资源进行多重更新。...3)、它锁 (X) 它锁 (X) (Exclusive (X) Locks) 用于数据修改操作,例如INSERT、UPDATE或DELETE。确保不会同时同一资源进行多重更新。...根据查询条件创建合适的索引,最大化提升索引查找的效率,此优化的一个目标是使索引查找返回尽可能少的,以最小化查询的的成本。...六、如何预防死锁 首先要理解,多并发的环境中死锁是不可避免的,只能通过合理的数据库设计、良好的索引、适当的查询语句以及隔离等级等措施尽量减少死锁。

    58180

    【MySQL】七种SQL优化方式 你知道几条

    页合并 目前表中已有数据的索引结构 ( 叶子节点 ) 如下: 当我们已有数据进行删除时,具体的效果如下 : 当删除一记录时,实际上记录并没有被物理删除,只是记录被标记( flaged...业务操作时,避免主键的修改。...因为创建索引的时候, age 是第一个 字段, phone 是第二个字段,所以排序时,也就该按照这个顺序来,否则就会出现 Using filesort。 F....为了解决上述的问题,我们可以创建一个索引,这个联合索引中 age 升序排序, phone 倒序 序。 G....原因是因为对于分组操作, 联合索引中,也是符合最左前缀法则的。 所以,分组操作中,我们需要通过以下两点进行优化,以提升性能: A.

    36140

    MySQLInnoDB中,乐观锁、悲观锁、共享锁、它锁、锁、表锁、死锁概念的理解

    例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我工作过程中,也会经常用到,乐观锁,它锁,等。于是今天就这几个概念进行学习,屡屡思路,记录一下。...悲观锁就是操作数据时,认为此操作会出现数据冲突,所以进行每次操作时都要通过获取锁才能进行相同数据的操作,这点跟java中的synchronized很相似,所以悲观锁需要耗费较多的时间。...它锁会阻塞所有的它锁和共享锁 读取为什么要加读锁呢:防止数据在被读取的时候被别的线程加上写锁, 使用方式:需要执行的语句后面加上 forupdate就可以了 锁又分共享锁和排他锁,由字面意思理解...SELECT * from TABLE where id = "1" lock in share mode; 结果集的数据都会加共享锁 排他锁: 名词解释:若某个事物某一加上了排他锁,只能这个事务进行读写...执行加锁时,会将id这个索引为1的记录加上锁,那么这个锁就是锁。 表锁 如何加表锁 innodb 的锁是在有索引的情况下,没有索引的表是锁定全表的.

    1.9K50

    MySQLInnoDB中,乐观锁、悲观锁、共享锁、它锁、锁、表锁、死锁概念的理解

    例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我工作过程中,也会经常用到,乐观锁,它锁,等。于是今天就这几个概念进行学习,屡屡思路,记录一下。...悲观锁就是操作数据时,认为此操作会出现数据冲突,所以进行每次操作时都要通过获取锁才能进行相同数据的操作,这点跟java中的synchronized很相似,所以悲观锁需要耗费较多的时间。...它锁会阻塞所有的它锁和共享锁 读取为什么要加读锁呢:防止数据在被读取的时候被别的线程加上写锁, 使用方式:需要执行的语句后面加上for update就可以了 锁又分共享锁和排他锁,由字面意思理解...SELECT * from TABLE where id = "1"  lock in share mode;  结果集的数据都会加共享锁 排他锁: 名词解释:若某个事物某一加上了排他锁,只能这个事务进行读写...执行加锁时,会将id这个索引为1的记录加上锁,那么这个锁就是锁。 表锁 如何加表锁 innodb 的锁是在有索引的情况下,没有索引的表是锁定全表的.

    2.6K40

    介绍下InnoDB的锁机制?

    其他用户可以并发读取数据,但直到所有共享锁都被释放之前,任何事务都无法对数据进行修改(获得数据上的排他锁)。 如果事务T对数据A加上共享锁后,其他事务只能对A再加共享锁,而不能加排他锁。...只有当没有其他线程查询结果集中的任何一使用排他锁时,才能成功申请排他锁;否则将被阻塞。 意向锁 MySQL的InnoDB引擎中,支持多种锁级别,包括级锁和表级锁。...注意: 意向锁并非直接锁定资源,而是用于通知其他事务,以防止它们相同资源上设置不兼容的锁。 意向锁不是由用户直接请求的,而是由MySQL系统管理的。...意向它锁:代表事务打算资源设置它锁(写锁)。这表明事务计划修改资源,不希望其他事务同时设置共享或它锁。 意向锁是表级锁,触发意向锁的事务提交或回滚后会释放。...尽管记录锁通常被称为级锁,但需要特别注意的是,它实际上锁定的是索引记录而非数据本身。此外,记录锁仅限于锁定索引。 当表中不存在索引时该如何处理?

    12910

    SQL优化思路+经典案例分析

    1.2.4 extra 该字段包含有关MySQL如何解析查询的其他信息,它一般会出现这几个值: Using filesort:表示按文件排序,一般是指定的排序和索引排序不一致的情况才会出现。...Using index condition:MySQL5.6之后新增的索引下推。存储引擎层进行数据过滤,而不是服务层过滤,利用索引现有的数据减少回表的数据。...也就是说limit 100000,10,就会扫描100010,而limit 0,10,只扫描10。 limit 100000,10 扫描更多的行数,也意味着回表更多的次数。 如何优化深分页问题?...age进行排序; 按照排序结果取前10返回给客户端。...2.9.3 如何优化group by呢 从哪些方向去优化呢? 方向1:既然它默认会排序,我们不给它是不是就行啦。 方向2:既然临时表是影响group by性能的X因素,我们是不是可以不用临时表?

    82310

    【向量检索研究系列】本地向量检索(下)

    1 背景上一篇文章《向量检索研究系列:本地向量检索(上)》介绍了如何加快向量相似度计算,但是一般的向量检索流程还包括计算结果进行排序,以及有必要的话,计算相似度之前可以对向量库中的向量进行过滤筛选(...图片举个例子,一个用户向量本来要和向量集所有1000个向量进行相似度计算,是否可以在内存中通过向量进行属性过滤,让用户向量只需要和向量集中500个向量进行相似度计算,这样可以加快总体的向量检索速度。...这三种方案的QPS和资源占用情况进行了测试,测试结果如下图:图片QPS:倒排索引 > Bitmap> 对象CPU资源:Bitmap > 对象 > 倒排索引时延(微秒级别,此处没有展示):对象 > Bitmap...同时也代码层面对分2段、4段、8段进行了测试,其排序时间对比如下图:图片可以看出,数据量越大,分段数越少排序越快,这和表格中的分段趋势估算一致。...3.2 局部排序前面提到的排序都是全量的数据进行排序,然后结果取TopK,如果只对部分数据进行排序拿到TopK结果,不关心其它数据顺序,因此可以考虑现有排序算法进行局部排序改造。

    1.9K31
    领券