【问题标题】:JavaFX: Disable multiple rows in TableView based on other TableViewJavaFX:基于其他 TableView 禁用 TableView 中的多行
【发布时间】:2014-12-23 23:49:25
【问题描述】:

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

------------------------------------------------------------------------------
| TableView 1                        |  TableView 2                          |  
|                                    |                                       |
|                                    |  Entry 1                              |
|                                    |  Entry 2                              |
|                                    |  Entry 3                              |
|                                    |  Entry ...                            |
|                                    |  Entry N                              |
------------------------------------------------------------------------------

我想将 TableView 2 中的项目复制到 TableView 1,但同时,需要禁用从 TableView 2 复制的条目(使用 setDisable 或类似的方法禁用该行)。我确实知道如何将项目从一个 tableview 复制到另一个。问题是当一个或多个条目被复制到 TableView 1 时,我不知道如何禁用多行。 我用 RowFactory 试过了,像这样:

productsInTransaction.setRowFactory(tv -> {
      TableRow<Product> row = new TableRow<>();
      row.disableProperty().bind(???);
      return row;
});

非常感谢任何帮助!

【问题讨论】:

    标签: javafx tableview


    【解决方案1】:

    我不太确定您想要的逻辑,但如果您的行工厂附加到表 1,并且当项目出现在表 2 中时您正在禁用该行,请执行以下操作:

    row.disableProperty().bind(Bindings.createBooleanBinding(() -> 
        table2.getItems().contains(row.getItem()), table2.getItems(), row.itemProperty()));
    

    【讨论】:

    • 谢谢!这似乎是正确的解决方案,但是,我想通过其属性之一来比较条目(在我的情况下是对象)。因此,例如,如果我有包含 Person 对象的 TableViews,这些对象具有 Name 和 Age 作为属性,我想禁用基于 Name(唯一)的行。我该怎么做?
    • 我现在的答案是“使用EasyBind framework”。可以做ObservableList&lt;String&gt; names = EasyBind.map(table2.getItems(), Person::getName);,然后绑定是createBooleanBinding( () -&gt; names.contains(row.getItem().getName()), names, row.itemProperty())
    • 当然,快速而肮脏的方法是在 Person 类中覆盖 equals(...) 以仅比较名称。当然,对于应用程序的其余部分,您可能需要为 equals(...) 提供不同的语义。
    • 它可以与 EasyBind 一起使用,但仍然会出现很多错误。看起来行工厂正在检查每一行,而 tableview 中只有一行
    • 是的,将为每个显示的行(不仅仅是包含数据的行)调用行工厂。因此,在调用 getName() 之前,您需要对 row.getItem() 进行空检查:尝试 createBooleanBinding( () -&gt; row.getItem() != null &amp;&amp; names.contains(row.getItem().getName()), names, row.itemProperty())
    猜你喜欢
    • 2015-06-17
    • 1970-01-01
    • 2014-12-23
    • 2017-11-03
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    相关资源
    最近更新 更多