加载 FXML 时解析“onAction”时出错

Posted

技术标签:

【中文标题】加载 FXML 时解析“onAction”时出错【英文标题】:Error resolving "onAction" while loading FXML 【发布时间】:2015-06-12 20:35:10 【问题描述】:

我在运行一个简单的 hello world 应用程序时遇到了一些问题。它抛出以下错误:

Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$152(LauncherImpl.java:182)
    at com.sun.javafx.application.LauncherImpl$$Lambda$2/1329552164.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javafx.fxml.LoadException: Error resolving onAction='#printHello', either the event handler is not in the Namespace or there is an error in the script.
/home/willi/java/IdeaProjects/JavaFXApp/out/production/JavaFXApp/sample/sample.fxml:23

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:104)
    at javafx.fxml.FXMLLoader$Element.processEventHandlerAttributes(FXMLLoader.java:606)
    at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:766)
    at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2827)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2536)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2445)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3218)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3179)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3152)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3128)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3108)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3101)
    at sample.Main.start(Main.java:13)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(LauncherImpl.java:863)
    at com.sun.javafx.application.LauncherImpl$$Lambda$57/2085742749.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl$$Lambda$52/738441956.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$170(PlatformImpl.java:295)
    at com.sun.javafx.application.PlatformImpl$$Lambda$55/689939224.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(PlatformImpl.java:294)
    at com.sun.javafx.application.PlatformImpl$$Lambda$53/1382865734.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$48(GtkApplication.java:139)
    at com.sun.glass.ui.gtk.GtkApplication$$Lambda$43/704249306.run(Unknown Source)
    ... 1 more

我的 Controller.java 文件中定义了 printHelloprintWorld 方法,我想在按下它们相应的按钮时调用它们。代码如下: 包装样品;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import java.awt.event.ActionEvent;

public class Controller 

    @FXML
    private Button helloButton;

    @FXML
    private Button worldButton;

    @FXML
    private void printHello(ActionEvent e)
        System.out.println("Hello");
    

    @FXML
    private void printWorld(ActionEvent f)
        System.out.println("World");
    

` 在我的 fxml 文件中,我定义了两个按钮。他们的代码如下:

<Button fx:id="helloButton" layoutX="46.0" layoutY="87.0" mnemonicParsing="false" onAction="#printHello" text="Hello" />

<Button fx:id="worldButton" layoutX="97.0" layoutY="87.0" mnemonicParsing="false" onAction="#printWorld" text="World" />

为什么我的代码会抛出这个错误?

抱歉,格式很糟糕,这是我第一次发帖。

【问题讨论】:

请发布您尝试运行的实际代码。 这应该可以。您能否确保在 fxml 中提供了正确的控制器类名称?或者,在此处发布完整的 fxml,以及 Controller 的包名称。 【参考方案1】:

您在控制器类中导入了错误的ActionEvent

import java.awt.event.ActionEvent;

改正

import javafx.event.ActionEvent;

【讨论】:

如果我有正确的导入但问题仍然存在,有什么建议可以继续吗? 这解决了我的问题。 Netbeans 导入了错误的 ActionEvent 类。 @RileyFitzpatrick 我建议检查控制器中是否存在该方法。

以上是关于加载 FXML 时解析“onAction”时出错的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX 动态添加按钮

将项添加到comboBox javaFx FXML时出错[重复]

多个 FXML 变量到 1 个控制器句柄

JAVAFX添加按钮事件备忘

当我使用 H2 数据库作为嵌入式时,Gluon 应用程序无法在 ios 上加载 FXML

将数据从存储加载到 bigquery 时解析数据类型时出错