2014-02-05 2 views
12

Как я понимаю, при использовании сценария 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(), поскольку конструктор будет запускать после сцены, загруженной сцены, и ее элементов, присвоенных переменным-членам. не
+0

Просто из любопытства вы использовали образец автоматического контроллера javafx scene builder? – ItachiUchiha

+0

@ItachiUchiha У меня есть, и хотя это уменьшает работу по созданию класса контроллера немного, он не затрагивает ни одну из проблем, которые я бы хотел избежать. Кроме того, это помогает только при первоначальном создании контроллера, а не при изменении представления с помощью существующего контроллера. – Feuermurmel

ответ

6

Я ничего не знаю, что делает именно то, что вы предлагаете в своем вопросе.

Вероятно, этот ответ, вероятно, со временем устареет.

Альтернативные технологии

JRuby достигает большинство ваших изложенных преимуществ использования несколько иной подход - он использует динамическую магию программирования JRuby, чтобы автоматически создать члены класса Ruby, из FXML динамически среды выполнения.

Tom Schindl написал инструмент, который генерирует Java-код из FXML. Из подходов, перечисленных в этом ответе, инструмент Тома кажется ближе всего к вашему вопросу.

SceneBuilder Каркасы

Подобный код Java-генератор из FXML доступен в SceneBuilder View | Show Sample Controller Skeleton особенность, которая описана в данном blog post. Когда я использую SceneBuilder, я все время использую эту функцию и стараюсь, чтобы мои контроллеры действительно светились, поэтому они почти полностью сгенерированы с помощью функции скелета SceneBuilder.

Это немного раздражает, потому что он не обеспечивает чистое выделение сгенерированного кода из написанного вручную кода, поэтому вам нужно быть осторожным, когда вы делаете обновления для FXML и хотите сгенерировать новый скелет, скопировать и вставить это над частями вашего существующего контроллера (плюс это небольшая ошибка, подверженная ручному управлению, которая занимает немного времени разработчика).

Source code for SceneBuilder доступен, если вы хотите посмотреть, как это работает.

Потенциальный инструмент для сборки плагинов

Такая функция генерации кода может сделать достойное дополнение к некоторым из существующих инструментов сборки в экосистеме JavaFX, таких как JavaFX Maven plugin или JavaFX Gradle plugin (или отдельный плагин в своем собственном правильно).

Будущее развитие

Я считаю, что Oracle также работают над расширением функций для FXML для будущей версии JavaFX (после Java 8), который собирает FXML непосредственно байт-код Java (файлы классов), минуя Шаг исходного кода Java. Этот вид функции, вероятно, достигнет большинства ваших намеченных преимуществ.

0

@Feuermurmel
нет нет никаких способов для создания автоматического контроллера класса для particula .fxml файла.
Вы должны определить динамически объявить переменную и метод с помощью anotation @fxml и установить (bind) в scence-builder.

+0

Теперь это можно сделать в любой среде IDE. – user3224416

6

Можно с версии NetBeans 8.

Открыть FXML, перейти на источник и нажмите кнопку генерировать контроллер.

Редактирование: теперь это можно сделать в любой среде IDE, для Eclipse необходим плагин.

+0

Я ищу что-то автоматизированное системой сборки, например. используя плагин Maven. – Feuermurmel

9

Теперь это поддерживается в SceneBuilder, NetBeans и в Eclipse. Обратите внимание, что это работает из коробки в NetBeans и SceneBuilder, но в Eclipse вам сначала нужен плагин e (fx) clipse.

SceneBuilder: Открыв файл FXML в редакторе, войдите в меню, чтобы выбрать «Просмотр» и «Показать скелет контрольного образца».

Eclipse: Откройте файл fxml, чтобы содержимое отображалось в панели редактирования кода (вы должны увидеть fxml как обычный текст xml с подсветкой синтаксиса внутри Eclipse, визуально не визуализироваться в SceneBuilder). Щелкните правой кнопкой мыши код в Eclipse и выберите «Код», а затем «Создать контроллер».

NetBeans: В NetBeans это еще проще, щелкните правой кнопкой мыши файл fxml в проводнике проекта и выберите «Сделать контроллер».

+0

+1 Btw, просто обновление. В Eclipse Oxygen будет щелкнуть правой кнопкой мыши код -> Source -> Generate Controller – user3437460

1

Как я знаю, в netbeans существуют два вида решений.

Во-первых, внутренняя функция netbeans «Make Controller», которую вы можете щелкнуть правой кнопкой мыши по документу fxml. он будет генерировать класс контроллера, который будет работать с FXMLLoader. Имя файла java-файла контроллера должно указываться в документе fxml. (Левая панель -> Controller -> класс Controller)

Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 

Во-вторых, NetBeans игровая плагин "FXML 2 JAVA конвертер", который можно установить из меню (Tool -> Plugin -> Доступные Plugin -> FXML 2 JAVA конвертер). и вы можете увидеть пункт меню «Создать абстрактный класс», щелкнув правой кнопкой мыши на документе fxml. Он будет генерировать исходный код из документа fxml, и вы можете использовать его как абстрактный класс, не используя FXMLLoader, как обычный проект JavaFX, а не проект JavaFXML.

Смежные вопросы