Передача информации между двумя этапами с помощью 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
передается конструктору сцены.