「译」Maven 集成 JavaFX 8 以及 <fx:root> 问题探讨

栏目: Java · 发布时间: 8年前

内容简介:「译」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 文件,则分如下情况:

  1. simple.fxml 文件位于 src/main/resources/ 目录中,在 compile 阶段, simple.fxml 会按照层级复制到 target/classes/ 目录中,执行:
getClass().getClassLoader().getResource("simple.fxml")
getClass().getResource("/simple.fxml")
  1. 为了方便使用, 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 中包含 TextFieldButton ,不使用 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 才包含 TextFieldButton ,所以无法实现开始时,纯代码方式的自定义控件设计。

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

  1. JavaFX and Maven: NullPointerException: Location is required

  2. How to understand and use <fx:root> , in JavaFX


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Android编程权威指南(第3版)

Android编程权威指南(第3版)

比尔·菲利普斯 (Bill Phillips)、克里斯·斯图尔特 (Chris Stewart)、克莉丝汀·马西卡诺 (Kristin Marsicano) / 王明发 / 人民邮电出版社 / 2017-6 / 129.00元

Big Nerd Ranch 是美国一家专业的移动开发技术培训机构。本书主要以其Android 训练营教学课程为基础,融合了几位作者多年的心得体会,是一本完全面向实战的Android 编程权威指南。全书共36 章,详细介绍了8 个Android 应用的开发过程。通过这些精心设计的应用,读者可掌握很多重要的理论知识和开发技巧,获得宝贵的开发经验。 第3 版较之前版本增加了对数据绑定等新工具的介......一起来看看 《Android编程权威指南(第3版)》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换