为什么 javafx 输入检查在 scala 中不起作用
Why are the javafx Input checks not working in scala
上面的 link 基本上涵盖了我的问题的答案,但它在 scala 中对我不起作用。我有一个 TextField (eTextField),我想检查它是否包含 R 或 D。如果包含,则应启用按钮 (ePR_ePD)。这是我的代码中应该执行此操作的部分,但它没有启用按钮:
val isInvalid: BooleanBinding = Bindings.createBooleanBinding(() => !isValid(eTextField.getText, eTextField.textProperty))
println(isInvalid)
ePR_ePD.disableProperty().bind(isInvalid)
def isValid (eText: String, eTextProp: StringProperty): Boolean = {
println(eText.contains("R")||eText.contains("D"))
eText.contains("R")||eText.contains("D")
}
当 eTextField 包含 R 或 D 时,我的输出是:
BooleanBinding [invalid]
true
当它不包含任何一个时,我的输出是:
BooleanBinding [invalid]
false
但在这两种情况下,ePR_ePD 按钮都显示已禁用。它似乎与 BooleanBinding 有关,因为它始终无效。
也不确定为什么 isValid(eTextField.getText, eTextField.textProperty) 需要有 textProperty 参数,但这就是 link 中显示的答案。还尝试了“var isInvalid...”,但没有帮助。
根据 the documentation 和评论中所述,createBooleanBinding
有两个参数,即函数和可观察对象。
该函数只测试 属性 值,因此 isValid
不需要第二个参数。 (线索是实际上没有使用第二个参数)
def isValid (eText: String): Boolean =
eText.contains("R")|| eText.contains("D")
属性 本身作为第二个参数传递给 createBooleanBinding
而不是 isValid
:
createBooleanBinding(() => !isValid(eTextField.getText), eTextField.textProperty)
解决了我忘记在 SceneBuilder 中为 ePR_ePD 按钮输入 fx:id 的问题:
(在fxml控制器的initialize()方法中:)
val isInvalid: BooleanBinding = Bindings.createBooleanBinding( () => !(isValid(eTextField.getText)), eTextField.textProperty)
ePR_ePD.disableProperty().bind(isInvalid)
}
(在 initialize() 方法之外:)
def isValid (eText: String): Boolean = {
println(eText.contains("R")||eText.contains("D"))
eText.contains("R")||eText.contains("D")
}
唯一奇怪的是,当我使用另一种方法自动更改 eTextField 的内容时,它似乎调用了两次 isValid。当字段中没有 R 或 D 时,我的输出为 false false,当其中一个存在时为 true。
这也有效,没有 isValid 方法:
(在fxml控制器的initialize()方法中:)
val isInvalid: BooleanBinding = Bindings.createBooleanBinding(
() => !(eTextField.getText.contains("R")||eTextField.getText.contains("D")), eTextField.textProperty
)
ePR_ePD.disableProperty().bind(isInvalid)
感谢大家的帮助!
上面的 link 基本上涵盖了我的问题的答案,但它在 scala 中对我不起作用。我有一个 TextField (eTextField),我想检查它是否包含 R 或 D。如果包含,则应启用按钮 (ePR_ePD)。这是我的代码中应该执行此操作的部分,但它没有启用按钮:
val isInvalid: BooleanBinding = Bindings.createBooleanBinding(() => !isValid(eTextField.getText, eTextField.textProperty))
println(isInvalid)
ePR_ePD.disableProperty().bind(isInvalid)
def isValid (eText: String, eTextProp: StringProperty): Boolean = {
println(eText.contains("R")||eText.contains("D"))
eText.contains("R")||eText.contains("D")
}
当 eTextField 包含 R 或 D 时,我的输出是:
BooleanBinding [invalid]
true
当它不包含任何一个时,我的输出是:
BooleanBinding [invalid]
false
但在这两种情况下,ePR_ePD 按钮都显示已禁用。它似乎与 BooleanBinding 有关,因为它始终无效。
也不确定为什么 isValid(eTextField.getText, eTextField.textProperty) 需要有 textProperty 参数,但这就是 link 中显示的答案。还尝试了“var isInvalid...”,但没有帮助。
根据 the documentation 和评论中所述,createBooleanBinding
有两个参数,即函数和可观察对象。
该函数只测试 属性 值,因此 isValid
不需要第二个参数。 (线索是实际上没有使用第二个参数)
def isValid (eText: String): Boolean =
eText.contains("R")|| eText.contains("D")
属性 本身作为第二个参数传递给 createBooleanBinding
而不是 isValid
:
createBooleanBinding(() => !isValid(eTextField.getText), eTextField.textProperty)
解决了我忘记在 SceneBuilder 中为 ePR_ePD 按钮输入 fx:id 的问题:
(在fxml控制器的initialize()方法中:)
val isInvalid: BooleanBinding = Bindings.createBooleanBinding( () => !(isValid(eTextField.getText)), eTextField.textProperty)
ePR_ePD.disableProperty().bind(isInvalid)
}
(在 initialize() 方法之外:)
def isValid (eText: String): Boolean = {
println(eText.contains("R")||eText.contains("D"))
eText.contains("R")||eText.contains("D")
}
唯一奇怪的是,当我使用另一种方法自动更改 eTextField 的内容时,它似乎调用了两次 isValid。当字段中没有 R 或 D 时,我的输出为 false false,当其中一个存在时为 true。
这也有效,没有 isValid 方法:
(在fxml控制器的initialize()方法中:)
val isInvalid: BooleanBinding = Bindings.createBooleanBinding(
() => !(eTextField.getText.contains("R")||eTextField.getText.contains("D")), eTextField.textProperty
)
ePR_ePD.disableProperty().bind(isInvalid)
感谢大家的帮助!