java - 为 HeaderView 禁用 JTable 行排序器

标签 java swing jtable tablerowsorter rowsorter

我有 2 个 JTables,一个用于显示行,一个用于显示数据:

enter image description here

问题:当数据表被排序时,行也被排序:

enter image description here

是否可以让“RowHeaderView”表不像数据表那样排序?

public class SimpleJTableHeader extends JFrame {

    public JTable table;

    public SimpleJTableHeader() {

        // CREATE A JTABLE
        Object rowData[][] = { { "a" }, { "b" }, { "c" }, { "d" } };
        Object columnNames[] = { "1" };
        table = new JTable(rowData, columnNames);
        table.setRowHeight(20);
        table.setAutoCreateRowSorter(true);

        JScrollPane scrollPane = new JScrollPane(table);

        // ADD ROW NUMBERS TO THE TABLE
        scrollPane.setRowHeaderView(getHeaderTable());

        // SHOW TABLE
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.setSize(300, 150);
        frame.setVisible(true);
    }

    public JTable getHeaderTable() {
        final AbstractTableModel model = new AbstractTableModel() {

            private static final long serialVersionUID = 1L;

            @Override
            public int getColumnCount() {
                return 1;
            }

            @Override
            public Object getValueAt(int row, int column) {
                return table.convertRowIndexToModel(row);
            }

            @Override
            public int getRowCount() {
                return table.getRowCount();
            }
        };
        JTable headerTable = new JTable(model);
        headerTable.setPreferredScrollableViewportSize(new Dimension(40, 0));
        headerTable.setRowHeight(20);
        return headerTable;
    }

    public static void main(String args[]) {
        new SimpleJTableHeader();
    }
}

最佳答案

感谢 mKorbel 新的正确的 getHeaderTable 方法:

public JTable getHeaderTable() {
    DefaultTableModel model = new DefaultTableModel() {

        private static final long serialVersionUID = 1L;

        @Override
        public int getColumnCount() {
            return 1;
        }

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

        @Override
        public int getRowCount() {
            return table.getRowCount();
        }

        @Override
        public Class<?> getColumnClass(int colNum) {
            switch (colNum) {
            case 0:
                return String.class;
            default:
                return super.getColumnClass(colNum);
            }
        }
    };

    JTable headerTable = new JTable(model);
    for (int i = 0; i < table.getRowCount(); i++) {
        headerTable.setValueAt((i + 1), i, 0);
    }
    headerTable.setPreferredScrollableViewportSize(new Dimension(40, 0));
    headerTable.setRowHeight(20);
    return headerTable;
}

关于java - 为 HeaderView 禁用 JTable 行排序器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21041837/

相关文章:

java - java中的重叠图像

java - 如何在 Windows 10 上使用 Java 判断 wifi 或蜂窝连接

java - 从 JTextField 获取 boolean 值

java - PaintComponent 不被称为 netbeans GUI

java - 无需先单击即可在 JTable 中显示 JComboBox

java - JTable 仅在我调用 GUI() 的新实例时刷新;

java - 使用 Java 代码操作 MFC 对话框可执行文件

java - Hibernate 注解 Java 映射

java - onActivityResult() 和 : failure delivering result resultinfo who=null request=1 result=-1 data=intent (has extras)

java - 尝试替换文件中的字符时出现空指针异常