JTable - заставить один из заголовков вести себя по-разному при клике
У меня есть простой JTable:
String[] columnNames = {"Freetext",
"Numbers only",
"Combobox"};
Object[][] data = {
{"Kathy", new Integer(21), "Female"},
{"John", new Integer(19), "Male"},
{"Sue", new Integer(20), "Female"},
{"Joe", new Integer(22), "Male"}
};
final JTable table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setAutoCreateRowSorter(true);
table.setFillsViewportHeight(true);
TableColumn comboboxCol = table.getColumnModel().getColumn(2);
JComboBox comboBox = new JComboBox();
comboBox.addItem("Male");
comboBox.addItem("Female");
comboboxCol.setCellEditor(new DefaultCellEditor(comboBox));
table.getColumnModel().getColumn(1).setCellEditor(new IntegerEditor(0, 100));
Когда я нажимаю на заголовок столбца, он будет попеременно сортироваться по возрастанию и по убыванию. Я хотел бы добавить еще один заголовок столбца, который будет действовать по-другому при нажатии, при этом другие заголовки сохраняют свое поведение. Как бы Вы это сделали?
3 ответа
table.setAutoCreateRowSorter(true);
: Это действие определяет сортировщик строк, который является экземпляром TableRowSorter
, Это обеспечивает таблицу, которая выполняет простую сортировку, зависящую от локали, когда пользователь щелкает заголовок столбца. Вы можете указать порядок сортировки и приоритет столбца для сортировки, используя SortKeys
:
TableRowSorter sorter = (TableRowSorter) table.getRowSorter();
List <RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(table.getColumnModel().getColumnIndex("aColumnID"), SortOrder.ASCENDING));
sortKeys.add(new RowSorter.SortKey(table.getColumnModel().getColumnIndex("bColumnID"), SortOrder.UNSORTED));
// to specify no sorting should happen on 'bColumnID'
sorter.setSortKeys(sortKeys);
Опять же, если вы хотите указать событие в конкретном столбце, например столбец с идентификаторомbColumnID
:
table.getTableHeader().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
JTableHeader header = (JTableHeader)(e.getSource());
JTable tableView = header.getTable();
TableColumnModel columnModel = tableView.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
if(columnModel.getColumn(viewColumn).getIdentifier().equals("bColumnID"))
{
JOptionPane.showMessageDialog(null, "Hi bColumnID header is clicked");
}
}
});
Редактировать:
впрочем, я тебя неправильно понял (that upon one of the column header click you want the table unsorted and do other action) but as @camickr has made that clear
, используйте: sorter.setSortable(index, boolean)
,
Более формально, для отключения сортировки для конкретного столбца с идентификатором столбца, например, "bColumnName"
:
sorter.setSortable(table.getColumnModel().getColumnIndex("bColumnName"), false);
отключить сортировку для столбца с идентификатором "bColumnName"
,
Я хочу, чтобы это имело совершенно другое действие - НЕ расширенное действие сортировщика
Тогда у вас есть два шага:
Отключить сортировку по конкретному столбцу. Это делается с помощью
setSortable(column, false)
методDefaultRowSorter
,Включите другое действие при нажатии на заголовок таблицы. Это делается путем добавления MouseListener в заголовок таблицы.
Вы должны были бы реализовать свой собственный RowSorter
и в toggleSortOrder
Для этого вам нужно разрешить вашему столбцу с четырьмя параметрами переключаться на новый вид, который не будет у других столбцов.
Для обновления дисплея вы можете расширить DefaultTableCellHeaderRenderer
Класс и добавить другие элементы порядка сортировки помимо тех, которые существуют сегодня.
Фрагмент из класса:
SortOrder sortOrder = getColumnSortOrder(table, column);
if (sortOrder != null) {
switch(sortOrder) {
case ASCENDING:
sortIcon = UIManager.getIcon(
"Table.ascendingSortIcon");
break;
case DESCENDING:
sortIcon = UIManager.getIcon(
"Table.descendingSortIcon");
break;
case UNSORTED:
sortIcon = UIManager.getIcon(
"Table.naturalSortIcon");
break;
}
}