用于选择特定组合框值的 JavaFX 绑定

问题描述 投票:0回答:1

我的界面有两个输入字段:一个用于选择

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 属性。我尝试了一种不同的方法,在组合框中实现侦听器,但当然它仅在所选项目更改时才会触发。

java javafx binding listener
1个回答
0
投票

您最好只使用

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()
,它只是一个(可为空的)字符串。

© www.soinside.com 2019 - 2024. All rights reserved.