Исключить столбец из сортировки в JTable - PullRequest
3 голосов
/ 04 февраля 2011

У меня есть простой Swing JTable и TableRowSorter, сделанные мной.Однако я бы исключил первый столбец из сортировки, так как хочу, чтобы он отображал номера строк.Я не вижу ничего, кроме

sorter.setSortable(0, false);

, что делает столбец недоступным для щелчка, но по-прежнему сортируется при нажатии на другой столбец ... Поэтому возникает быстрый вопрос: как сохранить столбецсортировщик по TableRowSorter?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 04 февраля 2011

Итак, при сортировке JTable (пример ниже) по столбцу A получилось бы следующее. Однако вы хотите, чтобы данные сортировались, а не номера строк, правильно?

|row| column A  |       |row| column A  |
+---+-----------+       +---+-----------+
| 1 | blah blah |  -->  | 1 | blah blah |
| 2 | something |       | 3 | more blah |
| 3 | more blah |       | 2 | something |

Я бы подошел к этому с TableCellRenderer для столбца 0. Хитрость заключается в том, чтобы игнорировать переданное значение и вместо этого использовать параметр строки.

public class RowRenderer extends JLabel implements TableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object color,
        boolean isSelected, boolean hasFocus, int row, int column) {
        setText(Integer.toString(row));
        return this;
    }
}

Примечание: если вы разбиваете на страницы свою таблицу (т. Е. Модель не содержит все строки; например, только строки 100-200), вам нужно будет сообщить средству визуализации ячейки сумму, которую нужно добавить row для получения номера строки для отображения.

1 голос
/ 04 февраля 2011

JTable разработан для отображения строк данных, а не ячеек данных, поэтому на самом деле невозможно предотвратить сортировку отдельного столбца, как вы выразились. Вместо этого я бы попытался изменить ваш TableModel, чтобы он возвращал индекс строки для значения для этого столбца:

@Override public Object getValueAt(int rowIndex, int columnIndex) {
    if (columnIndex == 0) return rowIndex;
    else {
        // handle other columns
    }
}

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

0 голосов
/ 04 февраля 2011

Если номер строки не является частью данных, то он не должен храниться в модели.

Вместо этого я бы использовал заголовок строки, который отображает номер строки.Нечто подобное вы бы увидели в Excel.Для этого вы можете использовать Таблица номеров строк .

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