У меня была такая же проблема, и я искал об этом. Пока я нашел два способа сделать это.
- Метод «если я сам переписывал» : изменение базовых классов из Java.
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 (). Таким образом, когда вы будете перетаскивать столбец в этот неподвижный, вы все равно будете его перетаскивать, но он не поменяет их местами.
Обратите внимание, что этот метод потребует от вас явной установки пользовательского интерфейса для JTableHeader, используемого для вашей JTable, что на самом деле не идеально. Но это наиболее приспособленный вариант, поскольку он касается проблемы на том месте, где он должен быть.
- Метод «Давайте попробуем заблокировать нормальное поведение тем, что у нас есть на самом деле» : не изменяя пользовательский интерфейс, этот метод фокусируется на JTableHeader для блокировки команд, выполняемых пользовательским интерфейсом.
Сначала, чтобы заблокировать перетаскивание первого столбца, нам нужен подкласс из 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);
}
Но это не сработает, поскольку пользовательский интерфейс в любом случае обновит положение мыши в методе mouseDragged
, у вас будет прыжок из перетаскиваемого столбца в другое место.
Так что я все еще ищу и задаюсь вопросом, есть ли у кого-то предложения относительно этой части.