【问题标题】:Prevent reorder of first column in tableview?防止表视图中第一列的重新排序?
【发布时间】:2019-05-14 05:42:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: javafx tableview


    【解决方案1】:

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

    有一种已弃用的方法可以防止列本身可拖动,但它不会将任何其他列拖到其位置。因为那是听者。

    【讨论】:

      猜你喜欢
      • 2013-03-21
      • 1970-01-01
      • 2013-07-08
      • 2020-12-02
      • 2018-03-24
      • 2019-06-19
      • 2015-03-20
      • 2015-12-26
      • 1970-01-01
      相关资源
      最近更新 更多