内容简介:「译」Maven 集成 JavaFX 8 以及 <fx:root> 问题探讨
「博客搬家」原地址:简书 原发表时间: 2017-05-22
上一篇文章探讨了使用 IntelliJ IDEA 创建 JavaFX 工程,进而开发了所需应用程序。更实际的情况是需要使用 Maven, Gradle 等进行项目的构建。本文探讨使用 Maven 构建集成 JavaFX 8 的可执行程序的方法,以及 <fx:root>
根节点问题。
1. Maven 构建的程序未集成 FXML 布局文件
使用 Maven 直接构建,在 compile
阶段, .class
文件均被复制到 target/classes/
目录,而对于 .FXML
文件,则分如下情况:
-
simple.fxml
文件位于src/main/resources/
目录中,在compile
阶段,simple.fxml
会按照层级复制到target/classes/
目录中,执行:
getClass().getClassLoader().getResource("simple.fxml") getClass().getResource("/simple.fxml")
-
为了方便使用,
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> ...
> ``` 此时所有的 `.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. 参考资料
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Design systems
Not all design systems are equally effective. Some can generate coherent user experiences, others produce confusing patchwork designs. Some inspire teams to contribute to them, others are neglected. S......一起来看看 《Design systems》 这本书的介绍吧!
UNIX 时间戳转换
UNIX 时间戳转换
HEX HSV 转换工具
HEX HSV 互换工具