>我有一个简单的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));
当我单击列标题时,它将在升序和降序排序之间交替。我想再添加一个列标题,该列标题在单击时的作用会有所不同,其他标题会保留其行为。你会怎么做?
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);
同样,如果要在特定列上指定事件,例如 id 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"
列的排序。
我希望它有完全不同的动作 - 而不是分拣机的扩展动作
然后,您有一个两步过程:
-
禁用对特定列的排序。这是通过使用
DefaultRowSorter
setSortable(column, false)
方法完成的。 -
单击表标题时启用其他操作。这是通过将鼠标侦听器添加到表头来完成的。
实现自己的RowSorter
并且在toggleSortOrder
方法中,您需要允许具有 4 个选项的列切换到其他列没有的新排序。
要更新显示,您可以扩展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;
}
}