Могу ли я автоматически генерировать классы контроллеров из FXML?
Как я понимаю, при использовании 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(), поскольку конструктор будет выполняться после загрузки сцены и ее элементов присваивается переменным-членам.
6 ответов:
Я не знаю ничего, что бы в точности соответствовало тому, что вы предлагаете в своем вопросе.
Вероятно, этот ответ, вероятно, в конечном итоге будет довольно устаревшим с течением времени.
Альтернативные Технологии
JRuby достигает большинства описанных преимуществ, используя немного другой подход - он использует магию динамического программирования jRuby для автоматического создания членов класса Ruby из среды выполнения FXML Dynamic a.
Том Шиндл написал инструмент, который генерирует Java код из FXML. Из всех подходов, перечисленных в этом ответе, инструмент Тома кажется наиболее близким к вашему вопросу.
Скелеты SceneBuilder
Аналогичный генератор кода Java от FXML доступен в функции SceneBuilder
View | Show Sample Controller Skeleton, которая описана в этом блоге . Когда я использую SceneBuilder, я использую эту функцию все время и стараюсь, чтобы мои контроллеры были действительно легкими, поэтому они почти полностью автоматически генерируют код из функции скелета SceneBuilder.Это так немного раздражает, хотя, потому что он не обеспечивает четкое разделение сгенерированного кода от рукописного кода, поэтому вам нужно быть осторожным, когда вы делаете обновления FXML и хотите создать новый скелет и скопировать и вставить его на части вашего существующего контроллера (плюс это немного подверженная ошибкам ручная операция, которая занимает немного времени разработчика).
Исходный код SceneBuilder доступен, если вы хотите посмотреть, как он работает.
Потенциальное Построение Плагины Инструментов
Такая функция генерации кода может стать полезным дополнением к некоторым существующим инструментам сборки в экосистеме JavaFX, таким как JavaFX Maven plugin или JavaFX Gradle plugin (или отдельный плагин в своем собственном праве).Будущее Развитие
Я полагаю, что Oracle также работает над расширением функций для FXML для будущего выпуска JavaFX (после Java 8), который компилирует FXML непосредственно в байт-код Java (класс файлы), минуя этап исходного кода Java. Такого рода функция, вероятно, достигнет большинства из описанных вами преимуществ.
Теперь это поддерживается в SceneBuilder, NetBeans и Eclipse. Обратите внимание, что это работает из коробки в NetBeans и SceneBuilder, но в Eclipse вам сначала нужен плагин e(fx)clipse.
SceneBuilder: При открытии файла FXML в Редакторе, войдите в меню, чтобы выбрать " вид "и" показать образец скелета контроллера".
Затмение: Откройте файл fxml, чтобы содержимое отображалось на панели редактирования кода (Вы должны видеть fxml как обычный текст xml с подсветкой синтаксиса внутри Eclipse, не визуализируется визуально в SceneBuilder). Щелкните правой кнопкой мыши на коде в Eclipse и выберите "Code", а затем"Generate Controller".
NetBeans: В NetBeans это еще проще, щелкните правой кнопкой мыши файл fxml в обозревателе проектов и выберите "Make Controller".
Это возможно с NetBeans версии 8.
Откройте FXML, перейдите к источнику и нажмите кнопку создать контроллер.
Edit: теперь это можно сделать в любой IDE, Eclipse нужен плагин thought.
Как я знаю, существует два рода решения существуют в NetBeans.
Во-первых, внутренняя функция netbeans "Make Controller", которую вы можете увидеть, щелкнув правой кнопкой мыши на документе fxml. он будет генерировать класс контроллера, который будет работать с FXMLLoader. Имя java-файла контроллера должно быть указано в документе fxml. (левая панель - > контроллер - > класс контроллера)
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));Во-вторых, плагин netbeans "FXML 2 JAVA Converter", который вы можете установить из меню (Tool - > Plugin - > доступный плагин - > конвертер JAVA FXML 2). и вы можете увидеть пункт меню "создать абстрактный класс", щелкнув правой кнопкой мыши на документе fxml. Он будет генерировать исходный код из документа fxml, и вы можете использовать его как абстрактный класс без использования FXMLLoader, как обычный проект JavaFX, а не проект JavaFXML.
@Feuermurmel
нет там ни каких способов, чтобы создать класс контроллер автоматически для продажи .файл fxml.
вы должны динамически определить объявить переменную и метод, с помощью аннотаций @FXML и установить(привязать) в построителе науки.
Теперь вы можете легко сделать это с eclipse просто выполните следующие простые шаги:
- перейдите в файл fxml, для которого вы хотите создать контроллер
- щелкните правой кнопкой мыши и выберите источник
- Нажмите Кнопку Создать Контроллер
Comments