Как работать с FXML (передавать или получать значения из интерфейса) без использования класса контроллера в JavaFX?

1

Можно ли передавать/получать значения из полей интерфейса FXML в JavaFX без использования класса контроллера?

Теги:
javafx-2

2 ответа

2

Нет, не совсем.

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>

Если вы можете найти что-то такое же простое, как избежать кнопки "Рассчитать" и просто обновить ярлык, поскольку текст в текстовых полях изменится, не стесняйтесь публиковать его. Я действительно не думаю, что это метод, применимый к любому реальному приложению.

1

Вы можете использовать другой шаблон, если вы создаете собственный корень для вашего 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, вы можете переопределять методы, добавлять новые поля и т.д....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню