2011-02-04 4 views
2

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

sorter.setSortable(0, false); 

Что делает столбец не интерактивный, но до сих пор сортируются, когда другой столбец щелкнул ... Так быстрый вопрос будет: как сохранить столбец из того сортировщик по TableRowSorter?

Спасибо!

ответ

4

Таким образом, с сортировкой JTable (ex ниже) на столбце 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

Отлично :-) Я получил это уже от предыдущего предложения, но ваше, безусловно, правильное решение. –

1

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

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

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

+0

Благодарим за ответ :-) Я уже реализовал getValueAt(), как вы сказали, но столбец остается сортируемым при щелчке по другим столбцам. Я попробую с помощью средства отображения таблицы. –

+0

Вторая идея сработала, спасибо. Просто создайте setCellRenderer в таблице, которую вы не хотите сортировать, и создайте TableCellRenderer, где значение равно value = rowIndex + 1; –

+0

Я также заметил, что первый метод не работал, вскоре после публикации. Я думаю, что это все еще возможно, но это, безусловно, более сложное решение. –

0

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

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

Смежные вопросы