【问题标题】:JavaFX Project StructureJavaFX 项目结构
【发布时间】:2014-09-16 21:00:33
【问题描述】:

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

我找到的关于 JavaFX 的每一个教程都过于简单和杂乱无章:他们只是创建一个包并在那里创建所有内容,每个控制器,每个 fxml,每个 css。我不想要那个。我希望事情在正确的地方。

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

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

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

另外,假设我想在正确登录时更改场景。在 FXML 控制器正确事件中,我必须调用“setScene”。这条路径也很难获得,因为如果我在不同的包中拥有 FXML。似乎所有东西都在一个巨大的臃肿包中,或者如果不诉诸诸如“../../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
      ...

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

对于“The Henley Sales”,拥有一个调用其中一个包的 FXML 的 Main 非常聪明(易于访问,FXML 的目录位于 Main 类下方)。不过,对于样式表,它必须由scene.getStylesheets().add(...); 硬编码。我真的更愿意选择在 FXML 中选择我的样式表。毕竟,样式表是 View 组件的一部分。使用这种结构从 FXML 中的 URL 访问 .css 文件会有点困难,因为它位于它们的目录之上。

另外,有了这个组织,我如何才能有竞争力地改变场景?在这个项目中,这不是必需的,因为整个项目是一个单独的 TabbedPane。 Main 调用它,它完成了。不需要更多的交换。但是一个简单的登录场景(或者任何需要交换整个场景的原因)需要访问 FXML 路径。

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

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

哦,顺便说一下,我使用的是 Netbeans。

【问题讨论】:

    标签: css javafx java-8 fxml organization


    【解决方案1】:

    恕我直言,你不应该根据你的观点创建包。

    我对此类应用的处理方法

    • 这些views中对应的controllers的一个包
    • 服务(业务)和 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 项目!

    【讨论】:

    • 嗯,这听起来很有趣,尽管似乎很难从 FXML 中的 URL 访问 css(除非我做 ../ 我有点不喜欢的事情......)。我可以将资源放在视图包之后,这是有道理的,因为资源是视图的一部分。我不知道什么是 Service 和 DAO,你能给我举个例子吗? (我要创建的应用程序使用 MySQL 服务器来获取和存储数据)
    • 更新了我的答案以更清晰!
    • 这种方法的缺点是视图和控制器不在同一个目录中,因此 SceneBuilder 无法链接它们。如果 ScreenBuilder 不需要它,我会将 fxml 放入资源文件夹中。
    • 您可以将 fxml 保存在资源文件夹中,并且场景构建器仍将链接所有内容。我当然会支持您将 fxml 保存在资源文件夹中的想法。
    • 你会在资源文件夹中放置一个数据库文件夹吗?所以它会是:src/main/resources/databases/exampledb.db
    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2013-07-11
    • 2013-06-30
    • 2019-02-08
    • 2018-12-19
    相关资源
    最近更新 更多