JavaFX FXML 加载异常的解决方法
本文介绍导致 JavaFX FXML 加载异常的原因并提供快速解决方案。
导致 JavaFX FXML 加载异常的原因
获得 JavaFX FXML 加载异常的第一个原因是 FXML 文件的路径未正确指定给加载程序。路径 /fxml/view.fxml
指的是一个名为 fxml
的文件夹中的文件 view.fxml
,该文件夹位于 resources
文件夹中,即在 classpath
上。
getClass().getResource()
调用在运行时调用对象 classloader
,它在 classpath
中搜索传递给它的资源。这样,它将在该文件夹中找到 fxml
文件夹和 view.fxml
文件。
第二个原因可能是组件 ID 不匹配,这意味着我们可能已经更新了 Controller
文件中的组件 ID,但忘记在 FXML 文件中更改该 ID(反之亦然)。在这种情况下,Controller
将无法在 view.fxml
文件中链接该组件。
看下面的块有一个清晰的理解。
在控制器
文件上:
@FXML
Button btnName1
在 FXML 视图
文件中:
fx:id="btnName_1"
以下是这两个原因的解决方案。
JavaFX FXML 加载异常的解决方法
要运行此应用程序,我们使用 Java 18、JavaFX 13 和 NetBeans IDE 版本 13。你可以根据自己的选择使用所有这些。
示例代码(view.fxml
文件,视图文件):
<!--Step1: XML declaration-->
<?xml version="1.0" encoding="UTF-8"?>
<!--Step 2: import necessary java types in FXML-->
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<!--Step 3: specify the FXML namespace-->
<AnchorPane prefHeight="300.0" prefWidth="400.0"
xmlns="http://javafx.com/javafx/11.0.1"
xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.mycompany.javafx_fxml_loadexception.viewController">
<!--Step 4: layout pane have children-->
<children>
<Button fx:id="btTest" layoutX="170.0"
layoutY="208.0" mnemonicParsing="false"
onAction="#onBtTestAction" text="Button" />
<Label layoutX="167.0" layoutY="126.0" text="Cick here!" />
</children>
</AnchorPane>
以下是上述代码的分步说明。
- 我们通过描述版本和编码来编写 XML 声明。
- 在 FXML 中导入所有必需的 Java 类型。
-
我们使用
AnchorPane
标签来声明fx
命名空间前缀。此标签允许将子节点的边缘锚定到距锚窗格边缘的偏移量。如果锚窗格中有填充或边框,则将从这些插图的内边缘测量偏移量。
AnchorPane
标签具有下面列出的各种属性,并附有简要说明。-
prefHeight
和prefWidth
属性可用于覆盖区域计算的首选高度和宽度。 -
在 FXML 中,
fx:controller
用于在root
元素上指定控制器。请记住,我们允许每个 FXML 文档有一个控制器,并且必须在root
元素上指定。
这段代码中的
root
元素是什么?AchnorPane
标记是此代码示例的root
元素,它是 FXML 文档的对象图中的顶级对象。所有 UI 元素都将添加到此元素中。此外,我们还需要知道控制器必须满足的规则;这些规则如下:
-
控制器由
FXML
加载器实例化。 -
控制器必须具有公共
no-args
构造函数。FXML
加载器如果不存在,将无法实例化它,从而导致加载时出现异常。 - 控制器可以包含可访问的函数,这些函数也可以在 FXML 中指定为事件处理程序。
-
FXML
控制器自动查找控制器的可访问实例变量。如果可访问实例变量的名称与元素的fx:id
属性匹配,则来自 FXML 的对象引用将自动复制到控制器实例变量中。
此功能将使控制器可以访问 FXML 中的 UI 元素引用。然后,控制器将能够使用它们。
-
控制器还可以访问
initialize()
函数,该函数不能接受参数并返回void
类型。一旦 FXML 文档的加载过程完成,FXML
加载器将调用initialize()
函数。
-
- 在 FXML 中,布局窗格包含子元素作为它们的子元素。考虑到项目需求,我们可以添加标签、按钮和其他元素。
示例代码(viewController.java
类,控制器类):
//Step 1: replace this package name with your package name
package com.mycompany.javafx_fxml_loadexception;
//Step 2: import necessary libraries
import javafx.fxml.FXML;
import javafx.scene.control.Button;
// Step 3: viewController class
public class viewController {
//define button
@FXML
private Button btTest;
//define the action when the button is clicked
@FXML
public void onBtTestAction() {
System.out.println("CLICK");
}//end onBtTestAction method
}//end viewController class
viewController.java
类是一个控制器类,它在某些成员上使用 @FXML
注释。请记住,此注解可用于构造函数和类。
使用此注释,我们指定 FXML
加载器可以轻松访问此成员,即使该成员是 private
。如果 FXML
加载器使用 public
成员,我们不需要使用 @FXML
注释。
但是,对 public
成员使用 @FXML
不会引发任何错误。因此,最好对每个成员进行注释。
以下 FXML
将控制器类的 onBtTestAction()
函数设置为 Button
的事件处理程序:
<Button fx:id="btTest" layoutX="170.0" layoutY="208.0" mnemonicParsing="false" onAction="#onBtTestAction" text="Button" />
示例代码(App.java
类,主类):
//Step 1: replace the package name with your package name
package com.mycompany.javafx_fxml_loadexception;
//Step 2: import necessary libraries
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
//Step 3: primary launch class extending the Application class
public class App extends Application {
/**
*
* @param stage
*/
@Override
public void start(Stage stage) {
//load the view.fxml file, add it to the scene and show it
try {
Parent parent = FXMLLoader.load(getClass().getResource("/fxml/view.fxml"));
//create a scene
Scene scene = new Scene(parent);
//set scene to a stage
stage.setScene(scene);
//show the stage
stage.show();
}//end try
catch (IOException e) {
e.printStackTrace();
}//end catch
}//end start method
public static void main(String[] args) {
launch(args);
}//end main method
}//end App class
主文件扩展
了 Application
类并覆盖了它的抽象方法 start()
。在 start()
方法中,我们加载 view.fxml
文件,创建场景,将此场景设置为舞台,并显示该舞台。
输出(当我们点击按钮
时,在 IDE 的控制台上打印单词 CLICK
):
检查以下屏幕截图以将每个文件放置在正确的位置:
相关文章
JavaFX 文本旋转
发布时间:2023/09/21 浏览次数:96 分类:Java
-
本介绍了如何在 JavaFX 中旋转文本。可以使用 JavaFX.scene.text.Text 类创建文本节点,并在 JavaFX 中使用 setRotate() 来旋转文本。本文介绍了如何在 JavaFX 中旋转文本。
JavaFX 区域与窗格
发布时间:2023/09/21 浏览次数:94 分类:Java
-
本文介绍了 JavaFX 中区域和窗格之间的区别。Region 和 Pane 用于将可调整大小的子节点调整到它们的首选大小,而不是重新定位它们。本文介绍了 JavaFX 中 Region 和 Pane 之间的区别。
JavaFX 媒体播放器
发布时间:2023/09/21 浏览次数:115 分类:Java
-
本文演示了 JavaFX 媒体播放器的正确使用,使用 JavaFX 播放媒体文件。在本文中,我们将学习如何使用 JavaFX 在 Java 中制作媒体播放器。为此,我们将使用内置的 JavaFX 并手动进行设置。
JavaFX 方形按钮
发布时间:2023/09/21 浏览次数:126 分类:Java
-
本文介绍如何在 JavaFX 中创建方形按钮。可以通过扩展 Java 中的 ToolBar 类来创建方形按钮。本文介绍了如何在 JavaFX 中创建方形按钮。
JavaFX setFill() 方法
发布时间:2023/09/21 浏览次数:187 分类:Java
-
本教程演示了如何在 JavaFX 中使用 setFill() 方法。setFill() 方法用于在 JavaFX 中填充形状和其他元素的颜色。本教程演示了在 JavaFX 中使用 setFill() 方法。
Java 中抛出多个异常
发布时间:2023/09/21 浏览次数:196 分类:Java
-
在本教程中,我们将在 Java 中抛出多个异常。本文将介绍如何在 Java 中抛出多个异常。异常是在程序执行期间破坏指令正常流程的不需要的和意外的事件。所有 Java 异常的根类都是 java.lang.Thr
Java 中的异常类型及其处理
发布时间:2023/09/20 浏览次数:163 分类:Java
-
本文通过不同的代码示例演示 Java 中的异常类型。它还介绍了异常处理过程。我们将了解 Java 中的异常类型及其处理。我们将在定义级别看到内置和用户定义的异常,并通过编写代码示例来理解
Java 中未处理的异常
发布时间:2023/09/20 浏览次数:90 分类:Java
-
本文介绍了未处理的异常以及如何在 Java 中处理这些异常。本文介绍了未处理的异常是什么以及如何在 Java 中处理它。异常是异常停止代码执行并导致代码终止的条件。