Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX:基于其他TableView禁用TableView中的多行_Javafx_Tableview - Fatal编程技术网

JavaFX:基于其他TableView禁用TableView中的多行

JavaFX:基于其他TableView禁用TableView中的多行,javafx,tableview,Javafx,Tableview,我正在用JavaFx创建一个应用程序。现在我有两个相邻的TableView: ------------------------------------------------------------------------------ | TableView 1 | TableView 2 | | |

我正在用JavaFx创建一个应用程序。现在我有两个相邻的TableView:

------------------------------------------------------------------------------
| 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())