我将以下代码作为侦听器添加到JTableHeader:
header.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
JTableHeader header = (JTableHeader) e.getSource();
JTable table = header.getTable();
TableColumnModel columnModel = table.getColumnModel();
int vci = columnModel.getColumnIndexAtX(e.getX());
int mci = table.convertColumnIndexToModel(vci);
if (mci == targetColumnIndex) {
TableColumn column = columnModel.getColumn(vci);
Object v = column.getHeaderValue();
boolean b = Status.DESELECTED.equals(v) ? true : false;
TableModel m = table.getModel();
for (int i = 0; i < m.getRowCount(); i++) m.setValueAt(b, i, mci);
column.setHeaderValue(b ? Status.SELECTED : Status.DESELECTED);
//header.repaint();
}
}
});
如果我手动选择一个或多个单元格,则如果单击ckeckAll标头,则将执行此代码,然后行的可视顺序发生变化,因此所选内容将跳到底部/顶部。有任何想法吗?
最佳答案
TableHeader
中的JTable
已经在其上具有内置的侦听器,该侦听器基于Comparator
对存储在该列中的特定Object
类型的值进行排序。
您正在向该表添加第二个侦听器,而不是覆盖内置的一个。因此,您正在看到这两种操作的效果。
更新资料
如果您不需要任何排序功能,则可以禁用行排序器,也可以仅实现自己的排序器。您也可以实现自己的自定义TableColumn
。