Проблемы с сортировкой целочисленных значений в JTable - PullRequest
2 голосов
/ 01 февраля 2012

В настоящее время у меня есть JTable, который использует RowSorter, но когда я щелкаю по заголовку, который я хочу отсортировать, он отображает строки в странном порядке

  • 1
  • 10
  • 11
  • ...
  • 2
  • 20
  • 21
  • ...
  • 3
  • 30

И все же, когда я выбираю определенную строку, скажем, строку 5, она меняет строку, помеченную 5. Есть ли причина, почему это происходит, и как я могу это исправить?

Ответы [ 6 ]

5 голосов
/ 01 февраля 2012

Вы можете установить тип столбца для JTable, явно указав его модель, как показано в следующем примере

setModel(new DefaultTableModel(new Object[0][], new String[] {
                "SELECT", "WHERE", "FIELD", "TYPE" }) {
            Class[] types = { Boolean.class, Boolean.class, String.class,
                    String.class };
            boolean[] canEdit = { true, false, false, false };

            @Override
            public Class getColumnClass(int columnIndex) {
                return this.types[columnIndex];
            }

            public boolean isCellEditable(int columnIndex) {
                return this.canEdit[columnIndex];
            }
        });

Задайте классы столбцов следующим образом (здесь первый и второй столбцы - логические, а остальные - String.

 Class[] types = { Boolean.class, Boolean.class, String.class,String.class };
3 голосов
/ 01 февраля 2012

Чтобы расширить ответ @aaamos, убедитесь, что ваш TableModel возвращает Number.class (или подходящий подкласс) из getColumnClass().Здесь есть связанный пример здесь .

3 голосов
/ 01 февраля 2012

Вы рассматриваете содержимое строки как текст.Ваш порядок сортировки алфавитный, а не числовой.Если вы рассматриваете содержимое как числа, оно само должно сработать.

0 голосов
/ 16 июля 2016

Я также пытался добиться того, что вы пытались сделать, и я изо всех сил пытался понять, как это сделать самому.Способ, которым я достиг "правильной" сортировки, был таким:

DefaultTableModel model = new DefaultTableModel(row, col){
    @Overrride
     public Class getColumnClass(int c) {
         return getValueAt(0, c).getClass();
     }
});
0 голосов
/ 01 июля 2016

Вы должны добавить приведенный ниже код к вашему фактическому коду, который не сортирует ваш столбец как целое число.

Ваш фактический код для создания JTable:

DefaultTableModel modeloT = new DefaultTableModel(); 
// But Sorts the column of numbers in wrong way. 1,11,2,25,......

РЕШЕНИЕ:

DefaultTableModel modeloT = new DefaultTableModel() {

// Defining the type of column on your JTable. I wish sort my second column as a numeric (1,2,11), not String (1,11,2). For that I defined the second class as Integer.
Class[] types = { String.class, Integer.class, String.class };
boolean[] canEdit = new boolean [] {
    false, false, false
};

    // You must add this Override in order to works sorting by numeric.
@Override
public Class getColumnClass(int columnIndex) {
        return this.types[columnIndex];
        }       

     // This override is just for avoid editing the content of my JTable. 
@Override
public boolean isCellEditable(int row, int column) {
        return false;
        }
};
0 голосов
/ 01 февраля 2012

Чтобы удовлетворить ваши требования, вы просто устанавливаете Comparator для RowSorter, который будет использоваться при сортировке указанного столбца. Код выглядит примерно так:

table.setAutoCreateRowSorter(true);
TableRowSorter<DefaultTableModel> rowSorter = (TableRowSorter<DefaultTableModel>)table.getRowSorter();
rowSorter.setComparator(5, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2)
        {
            return Integer.parseInt(o1) - Integer.parseInt(o2);
        }

    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...