防止在TableView中对第一列进行重新排序?

时间:2019-05-14 05:42:22

标签: javafx tableview

我有一个带有多个允许重新排序的列的表视图。该表是歌曲列表,每行代表一首歌曲。第一列(最左侧)用于在“活动”(正在播放歌曲)的行旁边显示图标。我想防止任何列重新排序到其左侧,并始终将其保留为表中的第一列。

我的理论是以某种方式拦截重新排序操作,如果某列尝试将自身插入为0列,则拒绝更改。但是我不知道该怎么做,或者至少找不到我需要使用的方法。无论如何,这是我在Swing中完成此任务的逻辑。

我已经搜索了互联网,发现的唯一解决方案是禁用所有列的重新排序。

1 个答案:

答案 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;
    }

}

有一个过时的方法可以防止列本身可拖动,但是不会将任何其他列拖动到其位置。因为那是听众。