JavaFX-Application:导出的jar文件只显示主阶段,而在Eclipse中显示所有对话框,为什么会有这种差异?
我试图在Windows上测试我的JavaFX桌面应用程序,并为此导出了一个jar文件。我的Eclipse IDE版本:2019-03(4.11.0) 到目前为止,我在Eclipse中运行的代码,但是当我运行jar文件时,只会弹出主阶段,下一个窗口不会显示,并且会在cmd上收到一些错误消息 我尝试使用这两个选项创建jar文件。标准的“导出”来自eclipse,然后是“JAR文件” 或者使用Efxclipse-Ant向导 两者的结果是一样的 这是我的main类的摘录,它生成“main stage”,这是从jar运行的唯一一个:JavaFX-Application:导出的jar文件只显示主阶段,而在Eclipse中显示所有对话框,为什么会有这种差异?,java,eclipse,javafx,Java,Eclipse,Javafx,我试图在Windows上测试我的JavaFX桌面应用程序,并为此导出了一个jar文件。我的Eclipse IDE版本:2019-03(4.11.0) 到目前为止,我在Eclipse中运行的代码,但是当我运行jar文件时,只会弹出主阶段,下一个窗口不会显示,并且会在cmd上收到一些错误消息 我尝试使用这两个选项创建jar文件。标准的“导出”来自eclipse,然后是“JAR文件” 或者使用Efxclipse-Ant向导 两者的结果是一样的 这是我的main类的摘录,它生成“main s
private static Stage primary;
public void start(Stage primaryStage) {
try {
primary = primaryStage;
primaryStage.setTitle("Unicon Automation Tool");
primaryStage.setScene(new Scene(root, 278, 143));
primaryStage.setResizable(false);
primaryStage.setMaximized(false);
// primaryStage.resizableProperty().setValue(Boolean.FALSE);
primaryStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
这是一个控制器类中的一些代码,用于后续阶段:
private static Stage mainMenu;
private void handleNextAction(ActionEvent event) {
Window owner = next.getScene().getWindow();
if (console.isSelected()) {
Main.goBack();
Main.setPresentationMode(0);
Test.test();
}
else if (ui.isSelected()) {
Main.goBack();
Main.setPresentationMode(1);
try {
Parent root = FXMLLoader.load(getClass().getResource("firstMenu.fxml"));
mainMenu = new Stage();
mainMenu.setTitle("Unicon Automation Tool");
mainMenu.setScene(new Scene(root,441, 218));
//mainMenu.resizableProperty().setValue(Boolean.FALSE);
mainMenu.setResizable(false);
mainMenu.setMaximized(false);
mainMenu.show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
AlertHelper.showAlert(Alert.AlertType.ERROR, owner, "Error!", "You must select one of the options!");
}
预期应用程序的窗口会像在Eclipse IDE中一样出现,但在我运行jar文件后,只会出现主阶段,单击“下一步”后,我会收到以下错误消息:
> Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java
.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader
.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Comp
ositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventH
andlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventH
andlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(C
ompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis
patcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat
chChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis
patcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat
chChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis
patcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat
chChainImpl.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:8411)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Bu
ttonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorS
kinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorS
kinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.h
andleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Comp
ositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventH
andlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventH
andlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(C
ompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis
patcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat
chChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis
patcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat
chChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDis
patcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispat
chChainImpl.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$MouseEventNotificatio
n.run(GlassViewEventHandler.java:394)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotificatio
n.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEve
nt$358(GlassViewEventHandler.java:432)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Quantum
Toolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Glas
sViewEventHandler.java:431)
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$152(WinApplication.ja
va:177)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.reflect.misc.Trampoline.invoke(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
... 48 more
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
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 application.MainMenuController.handleNextAction(MainMenuController.ja
va:70)
... 58 more
我今天可以测试代码,@helospark的注释是正确的答案。在源代码中匹配.fxml文件的名称并导出jar文件后,应用程序按预期工作。但奇怪的是,Eclipse IDE对大写字母“M”不敏感。我今天可以测试代码,@helospark的注释是正确的答案。在源代码中匹配.fxml文件的名称并导出jar文件后,应用程序按预期工作。但奇怪的是,EclipseIDE对jar文件中大写的'M'不敏感。Is
firstMenu.fxml
?在选择要导出的内容(jar02图像)时,您是否看到它已“选中”?最好在使用资源之前检查它们。在这里,它看起来getClass().getResource(“firstMenu.fxml”)
返回null。你好,Piro,是的,我在选择要导出的内容时选中了该文件,并在生成的jar文件中选中了该文件。我更新了屏幕截图(jar02图像),以便您也可以看到它:)@LuisP。在Java源代码中称为firstMenu.fxml
,而在jar中称为firstMenu.fxml
(注意大写字母“M”)。jar文件中是否有firstMenu.fxml
?在选择要导出的内容(jar02图像)时,您是否看到它已“选中”?最好在使用资源之前检查它们。在这里,它看起来getClass().getResource(“firstMenu.fxml”)
返回null。你好,Piro,是的,我在选择要导出的内容时选中了该文件,并在生成的jar文件中选中了该文件。我更新了屏幕截图(jar02图像),以便您也可以看到它:)@LuisP。在Java源代码中,它被称为firstMenu.fxml
,而在jar中,它被称为firstMenu.fxml
(注意大写字母“M”)。奇怪的是:为什么您希望eclipse对名称的拼写(在字符串和资源中)大喊大叫?有没有插件可以执行这种类型的扩展拼写检查?事实上,我发现奇怪的是,在Eclipse环境中,它可以工作,然后导出,而不是。fxml文件的名称是问题的原因。在我看来,我期待着一个通知,说明这种不匹配或“不存在”,就像我在项目中使用的类名或其他资源(如图像)一样,但如果大家都知道Eclipse不是这样处理.fxml文件的,那么我并不知道这一事实。只是好奇:为什么你期望Eclipse对名称的拼写大发雷霆(在字符串和资源中)?是否有插件进行这种类型的扩展拼写检查?实际上,我发现奇怪的是,在Eclipse环境中,它可以工作,然后导出,而不是。fxml文件的名称是问题的原因。在我看来,我希望出现这种不匹配或“不存在”的通知,就像我在项目中使用的类或其他资源(如图像)的名称一样,但如果大家都知道Eclipse不是这样处理.fxml文件的,那么事实上我并不知道。