Maven 集成 JavaFX 8 以及「fx:root」问题探讨
来源:互联网 发布:淘宝寄错东西了怎么办 编辑:程序博客网 时间:2024/05/21 04:44
上一篇文章探讨了使用 IntelliJ IDEA 创建 JavaFX 工程,进而开发了所需应用程序。更实际的情况是需要使用 Maven, Gradle 等进行项目的构建。本文探讨使用 Maven 构建集成 JavaFX 8 的可执行程序的方法,以及 <fx:root>
根节点问题。
1. Maven 构建的程序未集成 FXML 布局文件
使用 Maven 直接构建,在 compile
阶段, .class
文件均被复制到 target/classes/
目录,而对于 .FXML
文件,则分如下情况:
方法 1
simple.fxml
文件位于 src/main/resources/
目录中,在 compile
阶段,simple.fxml
会按照层级复制到 target/classes/
目录中,执行:
getClass().getClassLoader().getResource("simple.fxml")getClass().getResource("/simple.fxml")
方法 2
为了方便使用,simple.fxml
文件位于其 Controller 的同级目录中,此时在 compile
阶段,simple.fxml
会被忽略掉,Maven 不会复制位于 src
目录下的任何资源文件,故需要采取其他策略,通过搜索 StackOverflow
发现了解决方法如下:
在 pom.xml
文件中添加如下 resource
插件即可解决问题:
<build> ... <resources> <resource> <filtering>false</filtering> <directory>src/main/java</directory> <includes> <include>**/*.fxml</include> </includes> </resource> <resources> ...</build>
此时所有的 .fxml
文件均会被完整复制到 src
下的同级目录。
使用 Maven 构建可执行 Jar 可使用通用方法,具体参考:镜像1、镜像2
可执行 Jar 构建完毕后,在 Windows 平台下可以直接双击执行。
2. FXML 文件中,「fx:root」根节点问题探讨
为了更加方便灵活地使用自定义控件,更方便的集成 Controller 和 FXML 资源文件,以下内容对 StackOverflow
的一则回复进行翻译修改:
假设想要设计一个自定义控件:HBox
中包含 TextField
和 Button
,不使用 FXML
文件时,自定义控件设计如下:
public class MyComponent extends HBox { private TextField textField ; private Button button ; public MyComponent() { textField = new TextField(); button = new Button(); this.getChildren().addAll(textField, button); }}
此时可对该自定义控件方便地设计逻辑代码。
若使用 FXML
文件时,如:
<HBox> <TextField fx:id="textField"/> <Button fx:id="button" /></HBox>
此时 HBox
的 Controller 定义如下:
public class MyComponent extends HBox { @FXML private TextField textField ; @FXML private Button button ; public MyComponent() { try { FXMLLoader loader = new FXMLLoader(getClass().getResource("MyComponent.fxml")); loader.setController(this); HBox hbox = loader.load(); this.getChildren().add(hbox); } catch (IOException exc) { // handle exception } }}
此时该自定义控件为一个 HBox
包裹一个 HBox
,子 HBox
才包含 TextField
和 Button
,所以无法实现开始时,纯代码方式的自定义控件设计。
而使用 <fx:root>
后,可指导 Controller 类作为「根节点」,避免了 HBox
嵌套 HBox
的情况。
FXML 文件设计如下:
<fx:root type="javafx.scene.layout.HBox"> <TextField fx:id="textField" /> <Button fx:id="button" /></fx:root>
FXML 文件同时指明了根节点的类型,资源文件对应的 Controller 设计如下:
public class MyComponent extends HBox { @FXML private TextField textField ; @FXML private Button button ; public MyComponent() { try { FXMLLoader loader = new FXMLLoader(getClass().getResource("MyComponent.fxml")); loader.setController(this); loader.setRoot(this); loader.load(); } catch (IOException exc) { // handle exception } }}
此时可实现开始时,纯代码方式的自定义控件设计。
3. 参考资料
JavaFX and Maven: NullPointerException: Location is required
How to understand and use
<fx:root>
, in JavaFX
- Maven 集成 JavaFX 8 以及「fx:root」问题探讨
- javafx maven集成遇到的问题解决
- maven安装以及集成
- Maven----公司常用以及IDEA集成Maven
- JavaFX与Spring 集成
- FX的编译问题
- 使用e(fx)clipse进行JavaFX项目的打包
- 使用e(fx)clipse进行JavaFX项目的打包
- 搭建e(fx)clipse-JavaFX E4 RCP平台
- 安装e(fx)clipse到Eclipse (JavaFX工具)
- javafx报错not on fx application thread
- 在Eclipse中安装e(fx)lipse (JavaFX工具)
- MAVEN开发javaFX 2.0
- maven环境变量配置以及与eclipse集成
- Maven 的安装以及Eclispe集成
- myeclipse2014 集成maven 遇到的问题,解决方案
- Maven与Clover集成总结,license问题
- Maven与Mybatis集成时的问题
- yarn常用命令备忘
- RGBA与RGB和区别与转换
- AlphaGo对战柯洁,机器取胜已毫无悬念
- JAVA-二分法查找算法总结
- json对象与数组以及转换成js对象的简单实现方法
- Maven 集成 JavaFX 8 以及「fx:root」问题探讨
- ThreadPoolExecutor的PriorityBlockingQueue的cannot be cast to问题
- 检索学习
- 机器视觉开源代码集合(转)
- 关于Date、DateFormat、Calendar的综合应用--日历
- 加载图片框架Glide
- Profile 工具系列之二: gperftools
- 使用Spring Boot的跨源CORS设置
- leetcode 208. Implement Trie (Prefix Tree)字典树