Подтвердить что ты не робот

Структура проекта 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, кстати.

4b9b3361

Ответ 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!