JTable сортировка, как чисел

«Безопасный» способ - объявить, какие индексы столбцов являются числами:

public static class CustomTableModel extends DefaultTableModel {
        private final List<Integer> columnIndicesWithNumbers = Arrays.asList(0);

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (columnIndicesWithNumbers.contains(columnIndex))
                return Double.class;
            return super.getColumnClass(columnIndex);
        }
    }

Вот полный пример, чтобы проверить себя:

public class SorterTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            DefaultTableModel dm = new CustomTableModel();
            dm.addColumn("Integers");
            dm.addColumn("Strings");
            //@formatter:off 
            Object[][] data = { 
                    { 1, "Something" }, { 102, "Something Else" }, 
                    { 55, "Something" }, { 66, "Something" },
                    { 1000, "Something" }, { 1524, "Something" }, 
                    { 5801, "Something" }, { -55, "Something" },};
            //@formatter:on
            for (Object[] row : data) {
                dm.addRow(row);
            }
            JTable table = new JTable(dm);
            table.setAutoCreateRowSorter(true);

            JOptionPane.showMessageDialog(null, new JScrollPane(table));
        });
    }

    public static class CustomTableModel extends DefaultTableModel {
        private final List<Integer> columnIndicesWithNumbers = Arrays.asList(0);

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (columnIndicesWithNumbers.contains(columnIndex))
                return Double.class;
            return super.getColumnClass(columnIndex);
        }
    }
}

< Сильный > Предварительный просмотр:

preview

После ваших пояснений в разделе комментариев:

Вы можете использовать метод @Override getValueAt, чтобы возвращать целые числа вместо строк.

Полный пример:

public class SorterTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            DefaultTableModel dm = new CustomTableModel();
            dm.addColumn("Integers");
            dm.addColumn("Strings");
            //@formatter:off 
            Object[][] data = { 
                    { "1", "Something" }, { "102", "Something Else" }, 
                    { "55", "Something" }, { "66", "Something" },
                    { "1000", "Something" }, { "1524", "Something" }, 
                    { "5801", "Something" }, { "-55", "Something" },};
            //@formatter:on
            for (Object[] row : data) {
                dm.addRow(row);
            }
            JTable table = new JTable(dm);
            table.setAutoCreateRowSorter(true);

            JOptionPane.showMessageDialog(null, new JScrollPane(table));
        });
    }

    public static class CustomTableModel extends DefaultTableModel {
        private final List<Integer> columnIndicesWithNumbers = Arrays.asList(0);

        @Override
        public Object getValueAt(int row, int column) {
            Object value = super.getValueAt(row, column);
            if (columnIndicesWithNumbers.contains(column)) {
                return Double.parseDouble(String.valueOf(value));
            }
            return value;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (columnIndicesWithNumbers.contains(columnIndex))
                return Double.class;
            return super.getColumnClass(columnIndex);
        }
    }
}
2
George Z. 14 Авг 2020 в 21:15

Я думаю, вам не следует использовать типы, делая это. При определении столбцов вы должны создать экземпляр типа столбца, прежде чем что-либо устанавливать.