【发布时间】: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