【问题标题】:Binding boolean (Property) to List operations in JavaFX将布尔值(属性)绑定到 JavaFX 中的列表操作
【发布时间】:2018-08-08 05:04:18
【问题描述】:

在克服了我必须将每个字段重新声明为属性的事实之后,我发现 JavaFX 的表现力令人惊讶,所以我有点难过,想知道是否有更好、更惯用的方式将布尔值绑定到某些字段更复杂的操作,例如添加和删除样式类。

在此示例中,我有一个可能有效或无效的项目,并且我希望选项卡的字体颜色表明它是有效的。我通过添加和删除错误样式类来做到这一点:

    val errorSwitch = { valid : Boolean ->
        logger.debug {"errorSwitcher: $valid"}
        if( valid) tab.styleClass.remove("error")
        else tab.styleClass.add("error")
        Unit
    }
    product.isValid.onChange (errorSwitch)
    errorSwitch(product.isValid.value)

我在这里不喜欢的是,我必须自己调用一次函数才能开始,因为“onChange”显然不会触发,除非 isValid 实际发生变化。这是一件小事,但我想知道是否没有更好的绑定方法,因为这就是我想要的:错误类的存在应该绑定到“isValid”

【问题讨论】:

  • 除了使用Bindings.bindBidirectional 时,没有内置的方法可以做你想做的事。但是实现起来很简单,请查看EasyBind 中的subscribe 方法。
  • 这个库看起来棒极了,我去看看,谢谢!

标签: binding kotlin javafx-8 tornadofx


【解决方案1】:

在 TornadoFX 中,实现这一点的最佳方法是使用 toggleClass 函数,该函数将根据布尔可观察值自动添加或删除给定类。因此,您可以简单地说:

tab.toggleClass(Styles.error, product.isValid)

此示例要求您使用 TornadoFX 的类型安全 CSS 功能。在指南中阅读有关 Type Safe CSS 的更多信息:)

【讨论】:

  • 您好 Edvin,再次感谢您的帮助。这将是极好的,但不幸的是,我没有在我的 javafx.scene.control.Tab 对象上看到这个方法。这很可能是因为我只是从控制器以普通的旧 java/kotlin 方式实例化它。我会尝试将其分解,以便我可以使用 tornadofx 构建器。
  • 这个函数是 TornadoFX 提供的一个扩展函数,所以如果你确实在使用 TornadoFX(你用 tornadofx 标签标记了问题,所以我假设)并且你正在编写 Kotlin 代码,那么你可以通过导入tornadofx.* 使用此功能。如果您不使用 TornadoFX,那么我想您的初始解决方案是您能做的最好的:) 呵呵
  • 对不起,是的,我肯定在使用 tornadofx(这很有趣),但我认为问题在于 Tab 不是节点。我可以在其他组件上看到 toggleClass 功能,只是在标签上看不到
  • 啊,你是对的。我们可能会将 Node.toggleClass 和朋友移动到 EventTarget。会尽快调查!
  • 我刚刚在 Tab 上承诺了对这些的特别支持 :)
猜你喜欢
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
相关资源
最近更新 更多