Можно ли передавать/получать значения из полей интерфейса FXML в JavaFX без использования класса контроллера?
Нет, не совсем.
JavaFX следует за архитектурой типа MVC. Модель остается до программиста (с поддержкой наблюдаемых свойств JavaFX): FXML поддерживает представление, а контроллер Java - это контроллер.
Это дает хорошее разделение между определением макета (вид, в fxml) и логикой обработки (контроллер на Java), которая следует за давно установленными, проверенными стандартными стандартами. Он также сохраняет FXML приятным и простым, что позволяет легко создавать инструменты быстрой разработки приложений (RAD), такие как SceneBuilder.
Тем не менее, есть (по крайней мере, технически) поддержка сценариев в FXML, хотя я не знаю ни о каком реальном использовании этого (или даже, к этому, каких-либо реальных примерах). Документация FXML содержит краткий раздел по сценариям и, конечно же, следующие "работы":
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?language javascript?>
<VBox xmlns:fx="http://javafx.com/fxml/1">
<children>
<TextField promptText="Enter a number" fx:id="x" />
<TextField promptText="Enter another number" fx:id="y" />
<Button text="Calculate" onAction="sum.text=parseInt(x.text)+parseInt(y.text)"/>
<Label fx:id="sum" />
</children>
</VBox>
Если вы можете найти что-то такое же простое, как избежать кнопки "Рассчитать" и просто обновить ярлык, поскольку текст в текстовых полях изменится, не стесняйтесь публиковать его. Я действительно не думаю, что это метод, применимый к любому реальному приложению.
Вы можете использовать другой шаблон, если вы создаете собственный корень для вашего fxml с помощью fx: root, таким образом, "контроллер" также будет частью компонента, как в шаблоне Code Behind.
В основном, вы расширяете компонент JavaFX (например, BorderPane). Затем вы используете его как root вашего FXML. Для выполнения этой работы вам необходимо использовать метод setRoot (...) FXMLLoader и использовать fx: root в FXML.
Затем вы можете использовать свой собственный компонент JavaFX в качестве контроллера и вызывать FXMLLoader в конструкторе. В результате вы можете добавлять компоненты из своего FXML в свой пользовательский компонент Java:
public class MyJavaFXBorderPane extends BorderPane {
@FXML
public TextField textFieldFromFXML;
public MyJavaFXBorderPane() {
final FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("myfxml.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
}
}
Вы меняете порядок загрузки с помощью этой техники: сначала компонент Java (который также является контроллером), а затем FXML вместо FXML сначала с FXMLLoader, а затем его контроллером.
Таким образом, конечно, это контроллер, но и компонент, который является корнем fxml, вы можете переопределять методы, добавлять новые поля и т.д....