a、 disableProperty().bind(b.visibleProperty())在Java FX 10中导致元素呈现无效

a、 disableProperty().bind(b.visibleProperty())在Java FX 10中导致元素呈现无效,java,javafx,binding,javafx-8,java-10,Java,Javafx,Binding,Javafx 8,Java 10,这是Java 10中的回归,有关进一步更新,请参阅错误报告: 考虑以下Java FX代码,其中b开始不可见: a.disableProperty().bind(b.visibleProperty()) 如果使用此类代码的应用程序在Java 10 VM上运行,则从第一次看到b开始,a将始终呈现为禁用状态 当然,在a未被真正禁用的期间(尽管使用灰色覆盖渲染),您仍然可以与该元素交互。例如,您可以在输入控件中编辑文本,单击按钮/链接等,事件可以正确传播等 如果应用程序在Java8VM上运行,那么它将

这是Java 10中的回归,有关进一步更新,请参阅错误报告:


考虑以下Java FX代码,其中
b
开始不可见:
a.disableProperty().bind(b.visibleProperty())

如果使用此类代码的应用程序在Java 10 VM上运行,则从第一次看到
b
开始,
a
将始终呈现为禁用状态

当然,在
a
未被真正禁用的期间(尽管使用灰色覆盖渲染),您仍然可以与该元素交互。例如,您可以在输入控件中编辑文本,单击按钮/链接等,事件可以正确传播等

如果应用程序在Java8VM上运行,那么它将按预期工作

我目前没有EOS Java 9,因此我只测试了:

  • Windows 10 x64 Pro 1709和1803
  • Java 8u172 x64(在JDK和JRE上都明确针对可执行文件)
  • Java 10u1 x64(在JDK和JRE上都明确针对可执行文件)

Java 10的外观示例:

b
有机会出现之前,第一次启动时的外观:


SSCCE(对于一些模糊的问题,
A
将是
propertyProvider
b
将是
invalidRenderField
invalidRenderButton
):

正如预期的那样,JavaFX代码在指定的线程上执行


问题是,我是否做错了什么和/或遗漏了什么明显的东西?我似乎找不到这段代码有什么“错误”,它看起来很好,但却出现了故障。这是一个bug吗(我需要搜索)


总而言之,欢迎对解决方案提出任何建议。我需要这段代码(或通过解决方法获得的等效代码)才能在Java 10上工作,没有任何借口。

首先,我想确认我观察到的行为与您相同

  • Windows 10 x64主页
  • Java 1.8.0_172 x64--按预期工作
  • Java 10.0.1 x64--失败(显示为已禁用,但实际上未禁用)
这似乎是一个bug,您应该这样报告它


可能的解决方法

我发现,如果将以下代码添加到所有受影响的节点中,将正确呈现有问题的节点:

node.disableProperty().addListener((observable, oldValue, newValue) -> {
    if (!newValue) { // if no longer disabled
        node.applyCss();
    }
});
如果有许多节点可以禁用,并且与问题中描述的事件序列相同,那么这可能会变得单调乏味。创建某种类型的实用方法来处理此问题可能是谨慎的

编辑

我发现使
propertyProvider
不可见的顺序会影响我提供的解决方法。如果在显示新的
标题窗格
后将
属性提供程序
设置为不可见,则当返回到另一个
标题窗格
时,
文本字段
按钮
在不可见时仍显示为禁用。还没有找到解决的办法

Executing main(String[]) in main
Executing start(Stage) in JavaFX Application Thread
Executing 1st onAction(ActionEvent) in JavaFX Application Thread
Executing non-JFX code in WhateverThread
Executing onSuccess(WorkerStateEvent) in JavaFX Application Thread
node.disableProperty().addListener((observable, oldValue, newValue) -> {
    if (!newValue) { // if no longer disabled
        node.applyCss();
    }
});