JavaFx не предоставляет прямого решения, но может быть реализован обходной путь для предотвращения переупорядочения столбца.
Вы можете предотвратить это визуально, я имею в виду, если первый столбец находится в перемещенном списке.просто верните его туда, где вы хотите его видеть, это происходит так быстро, что пользователь даже не замечает этого.
Вот простой код, который вы можете проверить:
.fxml
:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="stackoverflow.reorder.Controller">
<TableView fx:id="table">
<columns>
<TableColumn fx:id="first" text="1"/>
<TableColumn text="2"/>
<TableColumn text="3"/>
<TableColumn text="4"/>
<TableColumn text="5"/>
</columns>
</TableView>
</AnchorPane>
Контроллер:
public class Controller implements Initializable {
@FXML private TableView<Object> table;
@FXML private TableColumn<Object, String> first;
private ListChangeListener<? super TableColumn<Object, ?>> columnReorderListener = c -> {
if (c.next()) {
if (c.getAddedSubList().contains(first)) {
table.getColumns().removeListener(listener());
table.getColumns().remove(first);
table.getColumns().add(0, first);
table.getColumns().addListener(listener());
}
}
};
@Override
public void initialize(URL location, ResourceBundle resources) {
// Its deprecated!!!
first.impl_setReorderable(false);
table.getColumns().addListener(columnReorderListener);
}
private ListChangeListener<? super TableColumn<Object, ?>> listener() {
return columnReorderListener;
}
}
Существует устаревший метод, который предотвращает перетаскивание самого столбца, но не позволяет перетаскивать его в любой другой столбец.,Ибо это слушатель.