JavaFX:Artifact仅显示空窗口

时间:2015-06-12 12:36:42

标签: java eclipse intellij-idea javafx

前言:我是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);
}

Artifact output

IDE output

4 个答案:

答案 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建议的方法。