7

这个问题在JavaFX: BooleanBindings in bind with multiple EasyBind maps停止的地方更进一步。

我想进一步扩展行工厂:在表 1 中,产品每行显示 1 件,因此 1 个产品对象可能有多行。现在我只想禁用一行,如果表 2 中的数量等于行的总和。例如:Product(SKU: P1)在table1中有三行(都代表金额1)。如果 Product(SKU: P1) 在 table2 中的数量 = -2,则需要在 table1 中禁用此产品对象的 2 行。仍然需要启用一个,不管三个中的哪一个。

我目前有以下代码:

table1.setRowFactory(tv -> {
    TableRow<Product> row = new TableRow<>();        
    row.disableProperty().bind(Bindings.createBooleanBinding(
    () -> row.getItem() != null && (row.getItem().getSKU().startsWith("C") ||
        (skuAmountLookup.containsKey(row.getItem().getSKU()) &&
            -skuAmountLookup.get(row.getItem().getSKU()) <
            amounts[SKUs.indexOf(row.getItem().getSKU())] )), 
        skuAmountLookup,
        row.itemProperty()));   
    return row;
});

哪里skuAmountLookup是:

skuAmountLookup = table2.getItems().stream().collect(
    Collectors.toMap(Product::getSKU, Product::getAmount, (x, y) -> y,
        () -> FXCollections.observableHashMap()));

这仅在总量为表 1 时禁用行。您可以更改amounts[SKUs.indexOf(row.getItem().getSKU())]0,这将在仅存在一种产品时禁用所有行。

我的问题是:如何更改行工厂以考虑另一行的 disableProperty?

有关其他信息,请参阅:JavaFX: BooleanBindings in bind with multiple EasyBind mapsJavaFX: Disable multiple rows in TableView based on other TableView

4

0 回答 0