我有一个带有多个允许重新排序的列的表视图。该表是歌曲列表,每行代表一首歌曲。第一列(最左侧)用于在“活动”(正在播放歌曲)的行旁边显示图标。我想防止任何列重新排序到其左侧,并始终将其保留为表中的第一列。
我的理论是以某种方式拦截重新排序操作,如果某列尝试将自身插入为0列,则拒绝更改。但是我不知道该怎么做,或者至少找不到我需要使用的方法。无论如何,这是我在Swing中完成此任务的逻辑。
我已经搜索了互联网,发现的唯一解决方案是禁用所有列的重新排序。
答案 0 :(得分:0)
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;
}
}
有一个过时的方法可以防止列本身可拖动,但是不会将任何其他列拖动到其位置。因为那是听众。