【发布时间】: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 失败。这不是资源不可用的问题... -
我猜你是对的,堆栈跟踪是一个比我正在做的更好的诊断工具。感谢您的帮助,我当前的模型有一个控制器类,可以在初始化方法中初始化表列,但是所述表列不在我要切换到的视图中,所以我认为这是问题的原因。