Как я понимаю, при использовании сценария Java FX, используя класс , класс контроллера записывается вручную, а его переменные-члены и методы могут ссылаться на файл .fxml
. При загрузке сцены с использованием FXMLLoader
переменные-члены устанавливаются в соответствующие элементы сцены, и методы автоматически подключаются к соответствующим событиям. Это работает, но очень громоздко, поскольку изменения необходимо выполнять в двух местах, и любые ошибки будут отображаться только во время выполнения.Могу ли я автоматически генерировать классы контроллеров из FXML?
Я видел другие рамки GUI, которые позволяют вместо этого генерировать контроллер из описания сцены как абстрактного класса, который необходимо реализовать для доступа к элементам сцены и обработки событий. Пример того, что я имею в виду:
Я хотел бы создать следующий .fxml
файл (например, с помощью JavaFX Scene Builder):
<AnchorPane ... >
<children>
<Button fx:id="button" ... text="Button" onAction="#buttonPressed" />
</children>
</AnchorPane>
Где-то в процессе сборки, следующий .java
файл будет создан (например, с использованием Maven плагина):
abstract class TestController {
protected final Parent root;
protected final Button button;
{
// Load test.fxml file
// Assign scene elements to root and button
// Attach event handler to the button that calls buttonClicked()
}
protected abstract void buttonClicked(ActionEvent event);
}
я мог тогда, возможно, несколько раз, создать конкретную реализацию, что контроллер:
final class TestControllerImpl extends TestController {
TestControllerImpl(String buttonLabel) {
button.setText(buttonLabel);
}
@Override
protected void buttonClicked(ActionEvent event) {
button.setText("I've been clicked! What a great day!");
}
}
Есть ли проект с целью сделать это? Или есть проблема с этим подходом, применяемым к FXML?
Я вижу следующие преимущества от этого подхода:
- декларации для переменных-членов и методов контроллера автоматически генерируются.
- Все переменные-члены окончательное и защищены вместо неконечного и либо общественность или аннотированного.
- То же самое для методов, они защищены вместо public или аннотированы.
- Невыполнение метода или орфографическая ошибка его имени приведет к ошибке компилятора.
- Программируемая установка сцены может быть выполнена в конструкторе вместо метода
initialize()
, поскольку конструктор будет запускать после сцены, загруженной сцены, и ее элементов, присвоенных переменным-членам. не
Просто из любопытства вы использовали образец автоматического контроллера javafx scene builder? – ItachiUchiha
@ItachiUchiha У меня есть, и хотя это уменьшает работу по созданию класса контроллера немного, он не затрагивает ни одну из проблем, которые я бы хотел избежать. Кроме того, это помогает только при первоначальном создании контроллера, а не при изменении представления с помощью существующего контроллера. – Feuermurmel