首页
学习
活动
专区
工具
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方法将视图索引转换为模型索引。

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

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

相关·内容

领券