a、 disableProperty().bind(b.visibleProperty())在Java FX 10中导致元素呈现无效
这是Java 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 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--失败(显示为已禁用,但实际上未禁用)
可能的解决方法 我发现,如果将以下代码添加到所有受影响的节点中,将正确呈现有问题的节点:
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();
}
});