JavaFX项目结构

问题描述 投票:17回答:1

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

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

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

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

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

另外,假设我想在正确登录时更改场景。在FXML Controller适当的事件中,我将不得不调用“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',它很聪明,有一个Main可以调用其中一个包'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。

css javafx java-8 fxml organization
1个回答
32
投票

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

我对这种应用的态度

  • 这些controllers的相应views
  • 服务(业务)和dao(持久性)层的不同包(如果存在)
  • 资源的目录,如图像,CSS等
  • FXML文件的目录,在资源中称为view 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项目!

© www.soinside.com 2019 - 2024. All rights reserved.