JavaFX项目结构

时间:2014-07-25 05:03:10

标签: css javafx java-8 fxml organization

使用FXML的JavaFX MVC模型听起来很棒,但我很难找到如何组织我的项目包。

我发现的关于JavaFX的每一个教程都过于简单和无组织:他们只需创建一个包并在那里创建所有内容,每个控制器,每个fxml,每个css。我不想那样。我希望事情能够在正确的位置。

仍然,JavaFX"路径"似乎..."限制"。 URL的使用使得如果我想将资源限制为本地文件,我必须完成整个getClass().getResource("foo.fxml").openStream()事情。这很好,但是通过从类路径获取资源,路径来自类所在的包。我有点想要项目的根。这会简化我的生活,但JavaFX看起来并不像那样。

让我们看一个实际的例子:

想象一下,我有一个FXML"登录屏幕"。想象一下,我希望登录屏幕使用样式表。理想情况下,该css将与该fxml位于同一个包中。但是,如果我想在另一个FXML中使用相同的.css呢?这是否意味着我必须将两个FXML放在同一个包中?显然我不需要",但我该怎么办?

另外,假设我想在正确登录时更改场景。在FXML Controller适当的事件中,我将不得不调用" setScene"。如果我在不同的包装中使用FXML,那么这条路也很难获得。似乎所有东西都在一个巨大的膨胀包中,或者一切都很难进入而不诉诸像#34; ../../ dir"这样的黑客。

http://docs.oracle.com/javafx/2/best_practices/jfxpub-best_practices.htm中的Henley Sales应用程序似乎是一个组织良好的应用程序的示例,尽管该应用程序是一个TabPane。不幸的是(至少我认为)来源不公开。它的想法是这样的:

client
  Main.class
  styles.css
      client.images
          image.png
      client.screen1
          Screen1.fxml
          Screen1Controller.java
      client.screen2
          Screen2.fxml
          Screen2Controller.java
      ...

这似乎是一个糟糕的开始,但它有一些问题(或者至少我认为它们是问题)。

对于'亨利销售',聪明的是有一个主叫它可以打电话给其中一个包裹' FXML(易于访问,FXML的目录在Main类下面)。但是,对于样式表,必须由scene.getStylesheets().add(...);进行硬编码。我真的更愿意选择在FXML中选择样式表。 Afterall,stylesheet是View组件的一部分。从FXML中的URL访问.css文件对于这种结构来说会有点困难,因为它位于其目录之上。

此外,通过这个组织,我如何才能更好地改变场景?在这个项目中,这不是必需的,因为整个项目是一个TabbedPane。主叫它,它完成了。无需更多交换。但是一个简单的登录场景(或者为什么需要交换整个场景的原因)需要访问FXML路径。

然后是资源。 Css文件可能需要使用图像。该结构通过将.css文件放在顶部,并为.css可能需要的文件创建一个包来解决它。如果我想要一个特定的FXML有一个不同的.css,那么,另一个问题就会到来。

这似乎是一个循环。 Css需要访问共享资源文件夹。 FXML需要访问Css。 FXML的控制器需要访问其他FXML。我希望我清楚我的项目结构存在疑虑。请帮我创建一个JavaFX项目结构,该结构对于超过基本的应用程序来说足够强大,或者将我重定向到一些好的源代码。

哦,我顺便使用Netbeans。

1 个答案:

答案 0 :(得分:32)

恕我直言,根据您的观点,您不应该创建套餐。

我对此类应用的态度

  • 这些controllers
  • 的相应views的包
  • 服务(业务)和dao(持久性)层的不同包(如果存在)
  • 图片,css等资源的目录
  • 资源

    中名为view的FXML文件的目录
    src/main
      ├──java
         ├── controllers
            ├──Screen1controller.java
            ├──Screen2controller.java
         ├── service
            ├──Service1.java
         ├── dao(persist)
            ├── SaveProducts.java
      ├──resources
         ├──view
            ├──screen1.fxml
            ├──screen2.fxml
         ├──css
            ├──style.css
         ├──images
            ├──img1.jpg
            ├──img2.jpg
    

上述实施可以考虑用于Maven项目。

对于简单项目,您可以查看structure here。这是一个maven项目!