我的界面有两个输入字段:一个用于选择的组合框Country
和一个复选框。
public class Country {
private String name;
public String getName() {
return name;
}
}
我只想启用复选框,如果在组合框中选择了特定值(例如Germany
)。
BooleanBinding noCountryBinding = Binding.isNull(cmbCountry.valueProperty());
BooleanBinding isGermanyBinding = Binding.equal(cmbCountry.getSelectionModel().selectedProperty().get().getName(), "Germany"); // <- This does not work, what can I do instead?
cbxFreeShipping.disableProperty().bind(Bindings.or(noCountryBinding, Bindings.not(isGermanyBinding));
第一个绑定本身工作正常,但我不知道如何让第二个绑定依赖于组合框项目的 String 属性。我尝试了一种不同的方法,即在组合框上实现一个侦听器,但它当然只会在选定项目发生变化时触发。
在 JavaFX 19 及更高版本中,您可以使用
ObservableValue.map(...)
:如果没有选择任何内容(或者如果从返回选定实例),则将
selectedCountryName
包含。null
Country
null
getName()
selectedCountryName.map(country -> ! "Germany".equals(country))
如果null
为selectedCountryName
空,则为,否则包含的结果!"Germany".equals(country)
。如果包含,则orElse(true)
调用返回一个包含的值。true
selectedCountryName
null
这是一个完整的例子:
最好
Bindings.createBooleanBinding()
只使用ComboBox.valueProperty()
。然后,您可以编写一个Supplier
将 的当前值评估ComboBox.valueProperty()
为简单的可空 的String
。这是 Kotlin,但概念相同:
这里的关键点是,在
Bindings.createBinding()
调用中,依赖关系是 ,comboBox.valueProperty()
这意味着Binding
将在每次更改时失效comboBox.valueProperty()
。然后 中的代码Supplier
将只查看comboBox.value
,这相当于comboBox.valueProperty().getValue()
,它只是一个(可空)字符串。您可以使用 Fluent API 来实现,但随后您需要将其
ObservableValue.map()
用作。但随后您需要将其转换为 才能使用 Fluent API,因为映射将返回。这并不难,但方法更简洁。Country.name
ObservableValue
ObservableStringValue
ObservableValue<String>
Bindings.createBooleanBinding()
为了完整起见,我想添加迄今为止已提交并经过我测试的两种解决方案。首先,这两种方法都有效!由于@DaveB 发布了 Kotlin 代码,因此这里有一个 Java 等效代码:
在我看来,这个实现更容易阅读和理解。
@James_D 提交的解决方案也有效,并且稍微简短一些:
但是,由于的性质,我觉得阅读起来有点困难
map()
。此外,没有选择国家/地区的情况也不是那么明确。从技术角度来看,不确定哪种解决方案更好,但我认为我会坚持第一种实现方式。- 尽管如此,我很欣赏这两个答案!