【问题标题】:Javafx loading fxml resource with Netbeans build to Jar [duplicate]Javafx使用Netbeans构建到Jar加载fxml资源[重复]
【发布时间】:2018-08-15 05:07:26
【问题描述】:

我会先声明我知道已经制作了许多类似的列表,但我还没有找到一个可以解决我当前问题的列表。

以下所有代码都在我的控制器类中:

    @FXML
    private void handleButtonAction(ActionEvent event) {
        Button button = (Button)event.getSource();
        String id = button.getId();
        Stage stage = (Stage)button.getScene().getWindow();
        openWindow("AddPartMenu.fxml", stage);
    }


    public void openWindow(String window, Stage stage){
        try{
            Parent root = FXMLLoader.load(getClass().getResource(window));
            Scene scene = new Scene(root);

            System.out.println("Show scene");
            stage.setScene(scene);
            stage.show();
        }catch(Exception e ){
            System.out.println("Failed to open new window: " + e.getMessage());
        }
    }

当我运行我的应用程序并单击上面代码中列出的按钮时,我收到以下错误

Failed to open new window
file:/C:/Users/Tyler/Documents/NetBeansProjects/InventoryManagementUI/dist/run167739486/InventoryManagementUI.jar!/inventorymanagementui/AddPartMenu.fxml

这似乎表明它正在尝试在 jar 文件中查找引用,但是当我打开 jar 存档时,"inventorymanagementui/AddPartMenu.fxml" 位于正确的位置。我从整个情况中得到的是,由于某种原因,当我在运行时从 Jar 内部调用 getClass().getResource() 时,它假设它在它下面的两层而不是打包在 Jar 内(查看下图以查看它现在是扁平包装)。我该如何解决这样的问题?

当前文件结构如图

编辑:

这是一张图片,显示了 Netbeans 正在调用的打开的 Jar 存档

这是调用 e.printStackTrace() 请求的完整堆栈跟踪

javafx.fxml.LoadException:file:/C:/Users/Tyler/Documents/NetBeansProjects/InventoryManagementUI/dist/run2024353111/InventoryManagementUI.jar!/inventorymanagementui/AddPartMenu.fxml

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at inventorymanagementui.FXMLDocumentController.openWindow(FXMLDocumentController.java:154)
at inventorymanagementui.FXMLDocumentController.handleButtonAction(FXMLDocumentController.java:88)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8413)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at inventorymanagementui.FXMLDocumentController.initialize(FXMLDocumentController.java:133)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
... 67 more

【问题讨论】:

  • 您可能已经认识到控制台输出不包含太多信息。这就是为什么您通常使用e.printStackTracke() 而不是自己构建错误消息的原因。请相应地修改catch 子句并将完整的堆栈跟踪添加到问题中。
  • 所以jar真的包含路径/inventorymanagementui/AddPartMenu.fxml?不是通过/AddPartMenu.fxml 下的一些构建黑客?后者需要getResource("/AddPartMenu.fxml")
  • 用请求的信息更新了帖子,并直接支持我的 jar 是用相同的路径构建的说法。问题似乎仍然是我的程序在运行时找不到路径并且有'!'在我不确定它指定的 jar 路径(在错误日志中)之后。
  • Caused by: java.lang.NullPointerException at inventorymanagementui.FXMLDocumentController.initialize(FXMLDocumentController.java:133) 您尝试在控制器的 initialize 方法的这一行中取消引用某些 null 表达式,这会导致加载 fxml 失败。这不是资源不可用的问题...
  • 我猜你是对的,堆栈跟踪是一个比我正在做的更好的诊断工具。感谢您的帮助,我当前的模型有一个控制器类,可以在初始化方法中初始化表列,但是所述表列不在我要切换到的视图中,所以我认为这是问题的原因。

标签: java javafx netbeans fxml


【解决方案1】:

发布完整的堆栈跟踪后,问题很明显:您没有为 AddPartMenu.fxml 设置控制器(或路径不正确)

如果我将错误的 fx:controller 路径放入我的现有项目中,我会得到同样的错误:

Caused by: javafx.fxml.LoadException: 
file:/F:/Documents/James-Docs/Code/MADContacts/target/MADContacts-1.1-SNAPSHOT.jar!/fxml/Contacts.fxml:17

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103)
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:922)
etc...

【讨论】:

  • 如果您查看错误代码和我发布的代码,应该很明显我需要修复什么。当我加载资源时,getClass().getResource(window) 无法按名称获取资源,因为 Jar 没有引用其中的数据。
  • 您发布的原始错误有些不清楚(即不明显,因为它可能是由多种原因引起的)。您遇到的问题是我想到的,但在您发布完整的堆栈跟踪之前不确定。看起来您没有为 AddPartMenu.fxml 分配控制器,或者它的路径引用有问题。
猜你喜欢
  • 2012-05-11
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 2011-04-26
  • 2011-07-22
相关资源
最近更新 更多