Структура проекта JavaFX
Модель JavaFX MVC с использованием FXML звучит потрясающе, и все, кроме меня, возникают проблемы с тем, как организовать мои пакеты проектов.
Каждый отдельный учебник, который я нашел о JavaFX, слишком прост и неорганизован: они просто создают один пакет и создают все там, каждый контроллер, каждый fxml, каждый css. Я этого не хочу. Я хочу, чтобы все было в их правильных местах.
Тем не менее, "pathing" JavaFX кажется... "ограниченным". Использование URL-адресов делает так, что если я хочу ограничить свои ресурсы локальными файлами, я должен выполнить целую getClass().getResource("foo.fxml").openStream()
вещь. Это здорово, но, получая ресурсы от пути к классу, путь из пакета, в котором находится класс. Мне вроде бы нужен корень проекта. Это упростит мою жизнь, но JavaFX, похоже, не работает так.
Перейдем к практическому примеру:
Представьте, что у меня есть экран входа в систему FXML. Представьте, что мне нужен этот экран входа в систему, чтобы использовать таблицу стилей. В идеале, css будет в одном пакете этого fxml. Но что, если я хочу использовать тот же .css в другом FXML? Это означает, что я должен разместить оба FXML в одном пакете? Очевидно, что мне "не нужно", но как мне это сделать?
Также, скажем, я хочу изменить сцену, когда я правильно вхожу. В правильном событии контроллера FXML мне пришлось бы называть "setScene". Этот путь также будет трудно получить, поскольку, если у меня есть FXML в разных пакетах. Просто кажется, что либо все в одном гигантском раздутом пакете, либо все труднодоступно, не прибегая к хакам вроде "../../dir".
Приложение Henley Sales в http://docs.oracle.com/javafx/2/best_practices/jfxpub-best_practices.htm похоже является примером хорошо организованного приложения, хотя приложение представляет собой единую TabPane. К несчастью (по крайней мере, я думаю) источник не открыт. Его идея такова:
client
Main.class
styles.css
client.images
image.png
client.screen1
Screen1.fxml
Screen1Controller.java
client.screen2
Screen2.fxml
Screen2Controller.java
...
Этот doenst кажется неудачным, но у него есть несколько проблем (или, по крайней мере, я вижу их как проблемы).
Для "The Henley Sales", умный, чтобы иметь Main, который назвал бы один из пакетов FXML (легкий доступ, каталоги FXML ниже основного класса). Тем не менее, для таблицы стилей это должно быть жестко запрограммировано scene.getStylesheets().add(...);
. Я действительно предпочел бы выбрать выбор моей таблицы стилей в FXML. Afterall, таблица стилей является частью компонента View. Доступ к файлу .css из URL-адреса в FXML был бы с трудом связан с этой структурой, так как она была выше их каталогов.
Кроме того, с этой организацией, как бы я мог сменить сцену на конкурсной основе? В этом проекте это не обязательно, потому что весь проект представляет собой отдельную вкладку. Главная называет это, и ее сделали. Нет необходимости в дополнительных свопах. Но простая сцена для входа в систему (или что-то другое - причина, по которой нужно поменять местами всю сцену) требует обращения к пути FXML.
А потом есть ресурсы. Файлы Css, возможно, должны использовать изображения. Эта структура решает его, помещая файл .css сверху и создавая пакет только для файлов, которые могут понадобиться .css. Если бы я хотел, чтобы у определенного FXML был другой .css, то возникла бы другая проблема.
Кажется, что это цикл. Css нуждается в доступе к папке общего ресурса. FXML нуждается в доступе к Css. Контроллерам FXML нужен доступ к другим FXML. Надеюсь, я был уверен в сомнениях в моей структуре проекта. Пожалуйста, помогите мне в создании структуры проекта JavaFX, которая достаточно мощна для более чем базового приложения или перенаправляет меня на хороший исходный код.
О, я использую Netbeans, кстати.
Ответы
Ответ 1
IMHO, вы не должны создавать пакет в зависимости от вашего экрана!
Мой подход к таким приложениям
- Пакет для соответствующих
controllers
этих views
- Разный пакет для обслуживания (бизнес) и уровня dao (persistence), если существует
- Пакет/папка для таких ресурсов, как изображения, css и т.д.
-
Пакет для fxml, называемый view
в ресурсах
src/main/java
|
controllers
|
Screen1controller.java
Screen2controller.java
service
|
Service1.java
dao(persist)
|
SaveProducts.java
src/main/resources
|
view
|
screen1.fxml
screen2.fxml
css
|
style.css
|
images
|
img1.jpg
img2.jpg
Вышеприведенная реализация может быть рассмотрена для проекта Maven
.
Для простого проекта вы можете просмотреть структуру здесь. Это проект maven!