前言:我是JavaFX的新手
制作一个简单的图像大小调整应用程序并需要构建应用程序的工件。 使用IntelliJ和Eclipse(两者兼得),我构建了普通的JAR工件和JavaFX工件。两者都是可执行的,但只显示一个空窗口。
从IDE启动应用程序时,没有问题;包含所有子窗格的窗口将按原样显示。
任何想法如何解决这个问题?提前谢谢!
应用程序初始化部分的附加代码和生成的窗口的图片 - 可能有帮助。
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);
}
答案 0 :(得分:3)
您没有提供足够的信息来解决您的问题,所以这是一个有效的例子:
创建一个包应用程序并将此类放入其中:
应用/ Main.java
package application;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
Parent root = FXMLLoader.load(getClass().getResource("/application/RootLayout.fxml"));
Scene scene = new Scene(root,400,400);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
创建" RootLayout.fxml"在包裹申请中。
应用/ RootLayout.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
<children>
<Pane layoutX="-125.0" layoutY="-143.0" prefHeight="200.0" prefWidth="200.0">
<children>
<Button layoutX="134.0" layoutY="161.0" mnemonicParsing="false" text="Button" />
</children>
</Pane>
</children>
</AnchorPane>
在Eclipse中选择
导出 - &gt; Runnable JAR文件 - &gt;将所需的库提取到 生成JAR
(当然你需要指定正确的启动配置)
生成的JAR可以执行,并且具有来自fxml的节点。
答案 1 :(得分:3)
loader.setLocation(MainApp.class.getResource("view/RootLayout.fxml"));
尝试
loader.setLocation(MainApp.class.getResource("/view/RootLayout.fxml"));
NetBeans第一个变体不会在IDE中编译
答案 2 :(得分:3)
我遇到了类似的问题。它与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
}
答案 3 :(得分:3)
我认为无法从jar文件访问资源文件。所以在这种情况下你试图从jar加载fxml文件是不可能的。另外,请遵循@Roland建议的方法。