【问题标题】:JavaFX TableView Selection Binding doesn't always fire - is there a better work around?JavaFX TableView 选择绑定并不总是触发 - 有更好的解决方法吗?
【发布时间】:2017-02-17 14:57:04
【问题描述】:

如果未选择任何内容或选择了多行,我需要禁用应用程序中的按钮。

我创建了以下绑定(额外的代码来调试它,因为它不工作)..

BooleanBinding singleDocIsntSelected =
                Bindings.createBooleanBinding(() -> {
                    boolean result = documentTable.getSelectionModel().getSelectedItems().size() != 1;
                    return result;
                }, documentTable.getSelectionModel().selectedItemProperty());

发生在我身上的是,当我选择第一行时,它会触发,然后如果我 CTRL + 单击同一行,它会再次触发。到目前为止,世界上一切都很好。然后我单击同一行 - 什么都没有,或者当我 CTRL 单击其他行时什么都没有。

我的按钮将保持错误状态。

但是,如果我还向该属性添加了一个侦听器:

ChangeListener<MyDTO> selectedItemsListener = (obs, ov, nv) -> {
    boolean result = table.getSelectionModel().getSelectedItems().size() != 1;
    System.err.println(result);
};

然后一切正常。

没有其他方法可以解决这个问题吗?

【问题讨论】:

  • 我试过了——同样的问题。

标签: binding javafx-8


【解决方案1】:

您需要在所选项目的列表 更改时使绑定失效,而不是在selectedItem 属性 更改时失效。如果选择了一个项目,则该项目成为所选项目:如果您随后选择 additional 个项目,selectedItemProperty 将不会改变(它仍然是所有已选择项目中的第一个)。

使用您当前的习语,只需绑定到选定的项目列表:

BooleanBinding singleDocIsntSelected =
    Bindings.createBooleanBinding(() -> {
        boolean result = documentTable.getSelectionModel().getSelectedItems().size() != 1;
        return result;
    }, documentTable.getSelectionModel().getSelectedItems());

或者,更简单地说,

BooleanBinding singleDocIsntSelected =
    Bindings.createBooleanBinding(
        () -> documentTable.getSelectionModel().getSelectedItems().size() != 1,
        documentTable.getSelectionModel().getSelectedItems());

虽然使用Bindings.size()IntegerBinding.isNotEqualTo() 可能更干净:

BooleanBinding singleDocIsntSelected = Bindings
    .size(documentTable.getSelectionModel().getSelectedItems())
    .isNotEqualTo(1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2012-12-20
    • 2010-09-29
    • 1970-01-01
    相关资源
    最近更新 更多