为什么 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)

感谢大家的帮助!