我使用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
排序,我没有添加任何代码。只需使用默认值。
答案 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;
});