java fx节点 位置更新_「译」Maven 集成 JavaFX 8 以及

「博客搬家」 原地址: 简书 原发表时间: 2017-05-22

上一篇文章探讨了使用 IntelliJ IDEA 创建 JavaFX 工程,进而开发了所需应用程序。更实际的情况是需要使用 Maven, Gradle 等进行项目的构建。本文探讨使用 Maven 构建集成 JavaFX 8 的可执行程序的方法,以及 根节点问题。

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 插件即可解决问题:

...

false

src/main/java

**/*.fxml

...

此时所有的 .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 的 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,所以无法实现开始时,纯代码方式的自定义控件设计。

而使用 后,可指导 Controller 类作为「根节点」,避免了 HBox 嵌套 HBox 的情况。

FXML 文件设计如下:

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. 参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值