我有同样的问题,我正在搜索它。到目前为止,我找到了两种方法。
TableColumn 需要一个新属性,例如“resizingAllowed”,它需要“reorderingAllowed”。
由此,修改发生在BasicTableHeaderUI:
已经有:
private static boolean canResize(TableColumn column,
JTableHeader header) {
return (column != null) && header.getResizingAllowed()
&& column.getResizable();
}
它也需要:
private static boolean canMove(TableColumn column,
JTableHeader header) {
return (column != null) && header.getReorderingAllowed()
&& column.getReorderable();
}
(请注意,如果您不希望仅第一列不移动,则无需更改 TableColumns 即可:
private static boolean canMove(TableColumn column,
JTableHeader header) {
return (column != null) && header.getReorderingAllowed()
&& header.getColumnModel().getColumnIndex(column.getIdentifier()) != 0;
}
)
之后,MouseInputListener中的两处修改:
如果这个新索引可以移动,您需要添加条件,例如使用“canMove()”方法。这样,当您将一列拖到这个固定的列时,您仍然会拖动它,但不会交换它们。
请注意,此方法需要您显式设置用于 JTable 的 JTableHeader 的 UI,这并不理想。但这是最适合的,因为它在它应该处理的地方处理问题。
-
“让我们尝试用我们实际拥有的东西来阻止正常行为”方法:不修改 UI,该方法专注于 JTableHeader 以阻止 UI 发出的命令。
首先,为了阻止拖动第一列,我们需要一个来自 JTableHeader 的子类,使用这个重写方法:
@Override
public void setDraggedColumn(TableColumn pAColumn)
{
int lIndex = -1;
if (pAColumn != null)
lIndex = getColumnModel().getColumnIndex(pAColumn.getIdentifier());
if (lIndex != 0)
super.setDraggedColumn(pAColumn);
}
这将阻止用户拖动第一列。但如前所述,这只是问题的一部分,我们需要防止另一个拖动的列与第一个交换。
到目前为止,我还没有正确的方法。我尝试通过继承 TableColumnModel 并覆盖 moveColumn() 方法:
@Override
public void moveColumn(int pColumnIndex, int pNewIndex)
{
//Move only if the first column is not concerned
if (pColumnIndex =! 0 && pNewIndex != 0)
super.moveColumn(pColumnIndex, pNewIndex);
}
但这不起作用,因为 UI 无论如何都会在 mouseDragged 方法中更新鼠标位置,您将从拖动的列跳转到另一个位置。
所以我还在找,不知道有没有人有关于这部分的建议。