当前位置: 首页 > 知识库问答 >
问题:

在JAR文件中加载时,未调用JavaFX 2.2控制器initialize()

岳卓君
2023-03-14

背景:我创建了一个JavaFX应用程序,使用JFXPanel嵌入到Swing框架中。我一直在使用Eclipse作为IDE。“主应用程序”是另一个类,它仅用于创建一个类的实例,该类扩展 JFXPanel 以在实例化时加载我的 .fxml 文件。从 Eclipse 执行主类时,一切都很好,我的 .fxml 文件中指定的 fx:controller 有它的 initialize() 方法调用(我可以从它在加载时对 UI 所做的更改中看出),并且没有问题。

但是,当我将所有内容打包到 JAR 中并尝试将我的 JFXPanel 扩展类添加到 Swing JFrame 实例时,它设法加载 .fxml 文件只是精细读取图像、样式表等,其余代码按预期运行,但 fx:controllerinitialize() 方法从未被调用。我从 jar 内部或外部的其他类访问该类没有问题,我什至尝试设置一个将返回控制器实例的控制器工厂,以及尝试设置 FXMLLoader 的类加载器以及使用调用 load() 的静态和非静态方法的各种组合.结果总是相同的:从 IDE 启动时它可以工作,但从打包的 jar 启动时不起作用。我知道 jar 没有丢失任何文件,因为就像我说的那样,从 Java 代码中找到类没有问题,捆绑的 fxml/css 文件似乎加载正常,减去控制器问题。

有人以前遇到过这种情况,或者知道FXMLLoader无法设置控制器会发生什么?这可能是某种错误吗?

共有3个答案

越心水
2023-03-14

我遇到了同样的问题,从IDE调用了初始化()方法,而不是从(阴影)jar调用。

问题是我们使用的ProGuard被配置为保持受保护的public方法。然而,initialize()方法被声明为私有。因此,它混淆了方法名,JavaFX找不到任何适当命名的方法,并且从未调用过initialize()

要阻止ProGuard混淆您的JavaFX注释方法和字段,请将此规则包含到您的proguard.conf中:

-keepattributes javafx.fxml.FXML

-keepclassmembers class * {
    @javafx.fxml.FXML *;
}

第一行将保留< code>@FXML注释,另一条规则保留< code>@FXML注释的类成员名。

陈德泽
2023-03-14

我无法解决这个问题。虽然fxml/css文件加载良好并引用了正确的控制器类,但我仍然无法看到控制器类的initialize()方法在所有内容打包到jar中后被调用。

由于我唯一需要控制器的事情是抓取fxml文件中定义的各种UI对象,以便我可以对它们进行真正的编程,所以我选择只创建一个递归搜索,根据场景树中的fxml ID来查找这些单独的小部件[似乎先查找“ID”,然后查找“fx:ID”,如果找不到“ID”]。。

//grabs fxml file relative to root of the jar
FXMLLoader loader = new FXMLLoader(ClassLoader.getSystemClassLoader().getResource("app.fxml"));
Parent javaFXRoot = (Parent) loader.load();

public Node findWidgetByID(String id, Parent javaFXRoot)
{
    return findObject(root, id);
}

private Node findObject(Parent root, String id)
{
    for (Node node : root.getChildrenUnmodifiable())
    {
        if (node.getId() != null && node.getId().equals(id))
        {
            return node; // found the node, return it
        }
        Node retValue = null;
        if (node instanceof Parent)
        {
            retValue = findObject(((Parent) node), id); // recursive search
        }
        if (retValue != null) //if our node was found by the recursive search, return that
        {
            return retValue;
        }
    }
    return null;
}
通鸿风
2023-03-14

当我将JavaFX软件打包成一个. jar文件时,我遇到了类似的问题。原来是相对路径的问题。您的IDE对此没有问题,但是当在jar中编译时,它就有问题了。

此问题已使用以下代码调用我的 .fxml 文件得到解决。

getClass().getClassloader().getResource("/my/view/selector.fxml")

要说这是您的错误的“原因”,我不确定,但这肯定会难倒我一段时间,并且似乎几乎是我遇到的问题。

原始问题:可执行Jar仅限于JavaFX的一个窗口

 类似资料:
  • 我是新来的Spring应用程序。我试图创建小Spring应用程序,但我得到404错误消息。似乎控制器(indexController)没有开始调用。我累了调试,但它不在那里。 文件位置: /WebContent/WEB-INF/pages/index.html /WebContent/WEB-INF/HelloWebServlet。xml /WebContent/WEB-INF/web.xml H

  • 我试图在JavaFX中从一个控制器调用另一个控制器。我在我的代码的另一部分中以几乎完全相同的方式完成了这项工作,并且它起了作用,但出于某种原因,它在这里不起作用。 我正在获取FXML资源并加载它,但是当我调用能力信息ontroller.set能力名称文本(能力名称);它给我以下错误说能力信息控制器是NULL:

  • 我已经为一个ScreenController类(一个由每个屏幕的单个控制器类扩展的类)创建了一个解决方案,它将处理我的应用程序中的基线屏幕层次结构。 在我的类中,我使用一个函数将另一个FXML文件的内容(加载)添加到当前控制器的当前主播上。 我的问题是: 1) 加载新的FXML时,FXML使用的类(或者更确切地说,特定的控制器)是否也被实例化/加载? 2) 执行此操作时,如果新FXMl的类被实例化

  • 我正在尝试从可执行JAR文件加载图像。 我跟踪了这里的信息,然后是这里的信息。 这是检索图像的函数: 这就是它的名称: 这是一个简单的对象。我也不会得到NullPointerException,除非它被UI屏蔽。 我检查了JAR文件,图像位于: /图片/标识1。巴布亚新几内亚 当前代码在eclipse中以及导出到JAR并在终端中运行时都有效,但在双击JAR时不起作用,在这种情况下,图标是默认的JF

  • 好的,基本上,我尝试使用这里描述的方法JarFileLoader来加载一个jar,其中包含一个类,该类的使用方式与类路径上的相同(类名将是动态的,因此我们可以添加任何jar任何类和程序将通过解析文本文件加载它,在主线中)。 问题是当我调试和检查URLClassLoader对象时 行: getResource()在参数中找不到类名。 有人已经尝试过用这种方式加载jar文件了吗? 谢谢。 加载器: 主

  • 当我尝试执行时,执行这一行 我从我的Lib文件夹中得到一个错误,说其中一个罐子不能正常工作。 我不知道jar文件是否有问题,因为它在Windows中运行良好,但在linux中不起作用。 这是我的. sh文件: 我刚把我在网上找到的东西抄了下来,因为我有一个朋友。bat文件从我使用Windows开始,从Windows到linux的传输是否要求我对jar文件做些什么?