【问题标题】:How two bind the selected property of two checkboxes vice versa in JavaFXJavaFX中两个复选框的选定属性如何反之亦然
【发布时间】:2016-02-24 15:51:38
【问题描述】:

我给出了两个复选框:checkboxDeSelectAllcheckboxSelectAllNotMandatories

现在我希望它们以这种方式绑定,如果用户选中其中一个,则自动取消选中另一个。

这段代码

checkboxDeSelectAll.selectedProperty().bindBidirectional(checkboxSelectAllNotMandatories.selectedProperty());

不起作用。如果我选择一个,另一个也会被选中。

我可以做相反的东西吗?

checkboxDeSelectAll.selectedProperty().bindBidirectional(checkboxSelectAllNotMandatories.selectedProperty().not());

不起作用..:/

感谢您的帮助!

【问题讨论】:

  • 为什么不使用单选按钮?
  • 因为应该可以取消选择它们!这不是“a or b”,而是“a or b or none of them”。
  • 啊,好的。这是有道理的......
  • 我认为您可以在切换组中使用ToggleButtons。这将为您提供相同的功能,但 UI 看起来会有所不同。大概您可以使用一些 CSS 使切换按钮看起来像一个复选框(或单选按钮),但注册两个侦听器可能更容易。

标签: java javafx binding


【解决方案1】:

据我所知,您只能对听众进行此操作:

checkboxDeSelectAll.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
    if (isNowSelected) {
        checkboxSelectAllNotMandatories.setSelected(false);
    }
});

checkboxSelectAllNotMandatories.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
    if (isNowSelected) {
        checkboxDeSelectAll.setSelected(false);
    }
});

【讨论】:

  • 我想知道为什么没有否定的可能性,或者类似 deselectedProperty 或类似的东西..
  • 绑定实际上只是方便添加监听器。添加完全由第一个属性决定的第二个属性将是多余的(在绝大多数情况下只会消耗额外的内存)。只有当函数是双射的时才能双向绑定到属性的函数:所以它在这种情况下有效,因为x -> ! x 在双射中,但是很难编写一个合理的 API 来验证甚至假设那个(只是尝试编写一个有效的 API)。 (您可以在这种特定情况下执行此操作,即带有 not 的布尔值,但一般情况下不起作用)
【解决方案2】:

像 James_D 一样,我也只接受听众。如果你想节省一些代码行,你可能想这样写:

    Stream.of(fxCb01, fxCb02).forEach(cb -> cb.selectedProperty().addListener((obsVal, oldVal, newVal) -> {
        if (cb.isSelected()) {
            CheckBox otherCb = (cb == fxCb01) ? fxCb02 : fxCb01;
            otherCb.setSelected(false);
        }
    }));

如果你真的想节省一些击键,你甚至可以将cb.isSelected()替换为newVal

我不确定,哪个更具可读性。这只是口味问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多