JavaFX:基于其他TableView禁用TableView中的多行
我正在用JavaFx创建一个应用程序。现在我有两个相邻的TableView:JavaFX:基于其他TableView禁用TableView中的多行,javafx,tableview,Javafx,Tableview,我正在用JavaFx创建一个应用程序。现在我有两个相邻的TableView: ------------------------------------------------------------------------------ | TableView 1 | TableView 2 | | |
------------------------------------------------------------------------------
| TableView 1 | TableView 2 |
| | |
| | Entry 1 |
| | Entry 2 |
| | Entry 3 |
| | Entry ... |
| | Entry N |
------------------------------------------------------------------------------
我想将项目从TableView 2复制到TableView 1,但同时,需要禁用从TableView 2复制的项目(使用setDisable或类似工具禁用行)。我知道如何将项目从一个tableview复制到另一个tableview。问题是,当一个或多个条目被复制到TableView 1时,我不知道如何禁用多行。
我用RowFactory试过这个,像这样:
productsInTransaction.setRowFactory(tv -> {
TableRow<Product> row = new TableRow<>();
row.disableProperty().bind(???);
return row;
});
productsTransaction.setRowFactory(电视->{
TableRow行=新TableRow();
row.disableProperty().bind(???);
返回行;
});
非常感谢您的帮助 我不太确定您想要的逻辑,但是如果您的行工厂附加到表1,并且当表2中存在该项时您正在禁用该行,请执行以下操作:
row.disableProperty().bind(Bindings.createBooleanBinding(() ->
table2.getItems().contains(row.getItem()), table2.getItems(), row.itemProperty()));
非常感谢。这似乎是正确的解决方案,但是,我想通过它的一个属性来比较条目(在我的例子中是对象)。例如,如果我有包含Person对象的TableView,这些对象的属性是Name和Age,那么我想禁用基于Name(唯一)的行。我怎么能做到这一点呢?在这一点上,我的基本答案是“使用”。您可以执行
observeListNames=EasyBind.map(table2.getItems(),Person::getName)然后绑定是createBooleanBinding(()->names.contains(row.getItem().getName()),names,row.itemProperty())
当然,快速而肮脏的方法是在Person
类中重写equals(…)
,以便只比较名称。当然,对于应用程序的其余部分,equals(…)
可能需要不同的语义。看起来行工厂正在检查每一行,而tableviewYes中只有一行,将为显示的每一行(不仅仅是包含数据的行)调用行工厂。因此,在调用getName()
之前,您需要对row.getItem()
进行空检查:尝试createBooleanBinding(()->row.getItem()!=null&&names.contains(row.getItem().getName()),names,row.itemProperty())