我的界面有两个输入字段:一个用于选择
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 属性。我尝试了一种不同的方法,在组合框中实现侦听器,但当然它仅在所选项目更改时才会触发。
您最好只使用
Bindings.createBooleanBinding()
来使用 ComboBox.valueProperty()
。 然后你可以编写一个 Supplier
来评估 ComboBox.valueProperty()
的当前值作为一个简单的、可为 null 的 String
。
这是 Kotlin,但概念是相同的:
class ComboBoxExample0 : Application() {
private val countries = FXCollections.observableArrayList(
Country("Germany"),
Country("France"), Country("Denmark")
)
override fun start(stage: Stage) {
val scene = Scene(createContent(), 280.0, 300.0)
stage.scene = scene
stage.show()
}
private fun createContent(): Region = VBox(20.0).apply {
val comboBox = ComboBox<Country>().apply {
items = countries
}
children +=
CheckBox("This is a CheckBox").apply {
disableProperty().bind(
Bindings.createBooleanBinding(
{ (comboBox.value == null) || (comboBox.value.name == "Germany") },
comboBox.valueProperty()
)
)
}
children += comboBox
padding = Insets(40.0)
}
}
data class Country(val name: String)
fun main() = Application.launch(ComboBoxExample0::class.java)
这里的关键点是,在
Bindings.createBinding()
调用中,依赖于 comboBox.valueProperty()
,这意味着只要 Binding
发生变化,comboBox.valueProperty()
就会失效。 然后Supplier
中的代码将只查看comboBox.value
,它相当于comboBox.valueProperty().getValue()
,它只是一个(可为空的)字符串。