Java FX8 TreeTableColumn排序

时间:2018-04-17 05:22:48

标签: javafx-8 treetableview

我使用TreeTableView在我的JavaFX应用程序中创建了一个表,并使用TreeTableColumn来指定其列。

默认情况下,表中的列是可单击的,只要单击列标题,就会对表中的数据进行排序。

每当用户点击表格的一行时,我都需要移动到另一个Scene。所以我创建了一个ChangeListener对象并将其添加到我的表的selectedItemProperty

我的程序运行正常。但是有一点点错,我不知道如何解决它。

每次我点击列标题对数据进行排序(如上所述),表格对数据进行排序,然后自动选择排序数据的第一行。因此,ChangeListener会发生,并转移到新的Scene

无论如何要防止程序在单击列标题时选择第一行表来排序数据?

请帮帮我。

修改:这是我添加ChangeListener的代码:

    table.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
    @Override
    public void changed(ObservableValue observable, Object oldValue, Object newValue) {
        TreeItem<TableModel> selected_item = (TreeItem<TableModel>) newValue;
        if(selected_item != null) {
            //Go to a new scene
            ....        
        }   
    }
    });

顺便说一下,我使用默认的TreeTableColumn排序,我没有添加任何代码。只需使用默认值。

1 个答案:

答案 0 :(得分:0)

您希望对行上的点击做出反应而不是选择更改。因此,您应该使用自定义rowFactory在行上注册侦听器:

table.setRowFactory(t -> {
    TreeTableRow<TableModel> ttr = new TreeTableRow<>();
    ttr.setOnMouseClicked(evt -> {
        if (!ttr.isEmpty()) {
            TableModel item = ttr.getItem();
            System.out.println("Clicked " + item); // TODO: replace
        }
    });
    return ttr;
});