我有一个简单的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));
当我点击colum标题时,它将在升序和降序排序之间交替。我想添加一个列标题,在点击时会有不同的行为,其他标题会保留其行为。你会怎么做?
答案 0 :(得分:2)
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"
的列的排序。
答案 1 :(得分:1)
我希望它有完全不同的动作 - 不是分拣机的扩展动作
然后你有两个步骤:
禁用特定列的排序。这是通过使用setSortable(column, false)
。
DefaultRowSorter
方法完成的
单击表标题时启用其他操作。这是通过向表头添加MouseListener来完成的。
答案 2 :(得分:0)
您必须实现自己的RowSorter
,并且在toggleSortOrder
方法中,您需要允许包含4个选项的列切换到其他列不具有的新排序。< / p>
要更新显示,您可以扩展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;
}
}