Как я понимаю, при использовании FXML для описания сцены Java FX класс контроллера записывается вручную, и его переменные-члены и методы могут быть отнесены к файлу .fxml
. При загрузке сцены с помощью FXMLLoader
переменные-члены устанавливаются в соответствующие элементы сцены, и методы автоматически подключаются к соответствующим событиям. Это работает, но очень громоздко, поскольку изменения должны выполняться в двух местах, и любые ошибки будут отображаться только во время выполнения.
Я видел другие интерфейсы графического интерфейса, которые позволяют вместо этого генерировать контроллер из описания сцены как абстрактного класса, который необходимо реализовать для доступа к элементам сцены и обработки событий. Пример того, что я имею в виду:
Я бы создал следующий .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?
Я вижу следующие преимущества этого подхода:
- Автоматически генерируются объявления переменных-членов и методов для контроллера.
- Все переменные-члены являются окончательными и защищены вместо нефинальных и общедоступных или аннотированных.
- То же самое для методов, они защищены, а не публичные или аннотированные.
- Не внедряя метод или не указывая его имя, это приведет к ошибке компилятора.
- Программная настройка сцены может быть выполнена в конструкторе вместо метода
initialize()
, потому что конструктор будет запускаться после загрузки сцены и элементов, назначенных переменным-членам.