Передача информации между двумя этапами с помощью ScalaFX не выполняется из-за отсутствия настройки поля в контроллере

Я пытаюсь понять возможности передачи сообщений ScalaFX в сочетании со ScalaFXML. Я создал небольшой пример, который имеет два представления с контроллерами, определенными в FXML. Первый (или Main), должен послать строку на второй (или Dialog), нажмите кнопку.

Я последовал примеру страницы ScalaFXML Github и использовал черту, чтобы получить контроллер, и я могу вызвать метод на контроллере Dialog, который устанавливает в поле другое значение. Этот метод вызывается правильно, но поле не перезаписывается, когда я проверяю, нажимая кнопку. Это как-то связано с инъекцией контроллера в ScalaFXML?

Ниже у меня есть код для двух контроллеров

@sfxml
class MainController(val clicky: Button,
                     val inputText: TextField,
                     val resultText: TextArea) {

  /** Creates a new window (in addition to the main window) and passes the contents of the text view to this window */
  def onButtonPressed(): Unit = {

    // Create the new window
    val dialogFXML: String = "/Dialog.fxml"
    val resource = getClass.getResource(dialogFXML)
    val rootView = FXMLView(resource, NoDependencyResolver)

    val loader = new FXMLLoader(resource, NoDependencyResolver)
    loader.load()
    val controller = loader.getController[AmountReceiver]
    controller.setAmount(inputText.text.value)

    val dialog = new Stage() {
      title = "Add Person"
      scene = new Scene(rootView)
      resizable = false
      initModality(Modality.ApplicationModal)
    }

    if (!dialog.showing()) {
      dialog.show()
    } else {
      dialog.requestFocus()
    }
  }
}

а также

@sfxml
class DialogController(val minAmountOfWords: Label,
                       val sendToMainButton: Button,
                       val input: TextArea) extends AmountReceiver {

  var amount: String = "empty"

  def submitText(): Unit = {
    println(s"The actual amount is ${this.amount}")

    // Close Dialog
    quitDialog()
  }

  override def setAmount(amount: String): Unit = {
    this.amount = amount
    println(s"Setting the amount to ${this.amount}")
  }


  def quitDialog(): Unit = {
    val stage: Stage = input.getScene.getWindow.asInstanceOf[Stage]
    stage.close()
  }

}

Запустив этот код и введя "2" в текстовое поле, вы получите следующий вывод:

Setting the amount to 2
The actual amount is empty

1 ответ

Решение

Я на самом деле понял это сам. Проблема лежит в rootView, который получен путем создания нового FXMLView, Чтобы получить доступ к правильному контроллеру, rootView должен быть получен загрузчиком, который уже используется для получения контроллера.

Так зовет

val rootView = loader.getRoot[jfxs.Parent]

вместо

val rootView = FXMLView(resource, NoDependencyResolver)

Как и в приведенном выше примере, rootView передается конструктору сцены.

Другие вопросы по тегам