使用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。
答案 0 :(得分:32)
我对此类应用的态度
controllers
views
的包
资源
中名为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项目!