JavaFX:Artifact仅显示空窗口
前言:我对JavaFX很陌生 制作了一个简单的图像大小调整应用程序,需要构建应用程序的工件。 使用IntelliJ和Eclipse(两者都尝试过),我构建了普通的JAR构件和JavaFX构件。两者都是可执行的,但只显示一个空窗口。 当从IDE启动应用程序时,没有问题;包含所有子平面的窗口将按其应有的方式显示 有没有办法解决这个问题?提前谢谢 附加的应用程序初始化部分的代码和生成的窗口的图片-可能会有所帮助JavaFX:Artifact仅显示空窗口,java,eclipse,intellij-idea,javafx,Java,Eclipse,Intellij Idea,Javafx,前言:我对JavaFX很陌生 制作了一个简单的图像大小调整应用程序,需要构建应用程序的工件。 使用IntelliJ和Eclipse(两者都尝试过),我构建了普通的JAR构件和JavaFX构件。两者都是可执行的,但只显示一个空窗口。 当从IDE启动应用程序时,没有问题;包含所有子平面的窗口将按其应有的方式显示 有没有办法解决这个问题?提前谢谢 附加的应用程序初始化部分的代码和生成的窗口的图片-可能会有所帮助 public class MainApp extends Application { p
public class MainApp extends Application {
private Stage primaryStage;
private BorderPane rootLayout;
private SettingsViewController settingController;
private MainViewController mainViewController;
@Override
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
this.primaryStage.setTitle("SimpleImageResizer");
this.primaryStage.getIcons().add(new Image("file:icon.png"));
this.primaryStage.setOnCloseRequest(we -> ConfigurationCache.getInstance().pushConfig());
targetResolutions.addAll(Arrays.asList(ResolutionPreset.values()));
supportedFileFormats.addAll(Arrays.asList(SupportedFileFormat.values()));
initRootLayout();
showMainView();
showSettingsView();
primaryStage.setResizable(false);
}
public void initRootLayout() {
try {
// Load root layout from fxml file.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainApp.class.getResource("view/RootLayout.fxml"));
rootLayout = loader.load();
// Show the scene containing the root layout.
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);
primaryStage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
.
.
.
public static void main(String[] args) {
launch(args);
}
您没有提供足够的信息来解决您的问题,因此以下是一个有效的示例: 创建包应用程序并将此类放入其中: application/Main.java 在包应用程序中创建“RootLayout.fxml” 应用程序/RootLayout.fxml
在Eclipse中选择
导出->运行JAR文件->将所需库提取到
生成罐
(当然,您需要指定正确的启动配置)
生成的JAR可以执行,并且具有来自fxml的节点
loader.setLocation(MainApp.class.getResource("view/RootLayout.fxml"));
试一试
loader.setLocation(MainApp.class.getResource("/view/RootLayout.fxml"));
NetBeans第一个变体将无法在IDE中编译,我遇到了类似的问题。它在IDE中运行良好,但当我创建jar并尝试运行它时,无法加载fxml文件。下面是我的工作。你可以试着检查一下它是否得到了fxml文件
String fxml = "/com/test/fxmls/gui.fxml";
InputStream in = MycLass.class.getResourceAsStream(fxml);
if(in!=null){
FXMLLoader loader = new FXMLLoader();
loader.setBuilderFactory(new JavaFXBuilderFactory());
loader.setLocation(MycLass.class.getResource(fxml));
BorderPane rootLayout = (BorderPane)loader.load(in);
}else{
//log or output the error
}
我认为不能从jar文件访问资源文件。因此,在本例中,您试图从jar加载fxml文件,这是不可能的。其他明智的做法是遵循@Roland建议的方法。你能解压jar以确保fxml文件被复制并位于jar中的正确位置吗?我刚刚解压了jar-是的,似乎每个文件都位于各自的位置。如果你只提供一个完整的项目,这将很容易解决(当然是最低版本)。您是否在命令行中启动了应用程序以查看是否引发了任何异常?还没有看到,所以我问:您使用的是什么操作系统?您使用的是什么Java版本?(尝试使用Windows/Linux/Mac OSX(32或64位)和OpenJRE/JDK x86/x64或OracleJRE/JDK x86/x64等选项回答)。当然,您必须更改加载方法,使其在
getResource(“/view/RootLayout.fxml”)
字符串中的“/”与编译有什么关系?ups,不是compile just run。他的问题不是它在IDE中没有运行。他的问题是它没有作为JAR运行。
loader.setLocation(MainApp.class.getResource("/view/RootLayout.fxml"));
String fxml = "/com/test/fxmls/gui.fxml";
InputStream in = MycLass.class.getResourceAsStream(fxml);
if(in!=null){
FXMLLoader loader = new FXMLLoader();
loader.setBuilderFactory(new JavaFXBuilderFactory());
loader.setLocation(MycLass.class.getResource(fxml));
BorderPane rootLayout = (BorderPane)loader.load(in);
}else{
//log or output the error
}