当前位置: 首页 > 知识库问答 >
问题:

Javafx位置是必需的(从另一个文件夹/包加载FXML文件)

易炳
2023-03-14

我在使用Java和FXML文件时遇到了一个问题。

现在我找了好几个小时,找不到任何解决我问题的东西,所以我最后的希望是针对我的具体情况提出问题(我知道像这个问题和其他问题,但没有一个真正帮助我在这方面。

简单说明:我有一个Eclipse Java项目,我的类(对于这个问题很重要)在包[Project Name]/src/measurements.gui中。我的FXML文件在[Project Name]/Resources文件夹中。

加载FXML文件ElementsProperties.java的类如下所示:

import java.io.IOException;

import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.Window;

public class ElementsProperties {

  public static void show(Window parent, String title) {

    ElementsProperties el = new ElementsProperties();
    BorderPane root = el.loadFXMLFile("resources/TestWindow.fxml");

    Stage dialog = new Stage();
    dialog.initOwner(parent);
    dialog.setTitle(title);
    dialog.initModality(Modality.WINDOW_MODAL);
    dialog.setScene(new Scene(root));
    dialog.show();
  }

  @SuppressWarnings({ "finally", "static-access" })
  private BorderPane loadFXMLFile(String filePath) {
    BorderPane borderPane = null;
    try {
      borderPane = new BorderPane();
      FXMLLoader fxmlLoader = new FXMLLoader();
      Parent content = fxmlLoader.load(getClass().getResource(filePath));
      borderPane.setCenter(content);
    }
    catch (IOException e) {
      e.printStackTrace();
      System.err.println("Couldn't find the specified file");
    }
    catch(Exception e){
      e.printStackTrace();
    }
    finally {
     return borderPane;
    }
}}

FXML文件显示为包含以下简单行的对话框:elementsproperties.show(parent,“testwindow”);

我的FXML文件(使用JavaFXSceneBuilder2.0创建)如下所示:`

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.effect.*?>
<?import javafx.geometry.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.text.*?>

<VBox prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
  <children>
    <MenuBar VBox.vgrow="NEVER">
      <menus>
        <Menu mnemonicParsing="false" text="File">
          <items>
            <MenuItem mnemonicParsing="false" text="New" />
            <MenuItem mnemonicParsing="false" text="Open…" />
            <Menu mnemonicParsing="false" text="Open Recent" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Close" />
            <MenuItem mnemonicParsing="false" text="Save" />
            <MenuItem mnemonicParsing="false" text="Save As…" />
            <MenuItem mnemonicParsing="false" text="Revert" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Preferences…" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Quit" />
          </items>
        </Menu>
        <Menu mnemonicParsing="false" text="Edit">
          <items>
            <MenuItem mnemonicParsing="false" text="Undo" />
            <MenuItem mnemonicParsing="false" text="Redo" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Cut" />
            <MenuItem mnemonicParsing="false" text="Copy" />
            <MenuItem mnemonicParsing="false" text="Paste" />
            <MenuItem mnemonicParsing="false" text="Delete" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Select All" />
            <MenuItem mnemonicParsing="false" text="Unselect All" />
          </items>
        </Menu>
        <Menu mnemonicParsing="false" text="Help">
          <items>
            <MenuItem mnemonicParsing="false" text="About MyHelloApp" />
          </items>
        </Menu>
      </menus>
    </MenuBar>
    <AnchorPane maxHeight="-1.0" maxWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
      <children>
        <Label alignment="CENTER" layoutX="155.0" layoutY="177.0" style="&#10;" text="Drag components from Library here…" textAlignment="CENTER" textFill="#9f9f9f" wrapText="false">
          <font>
            <Font size="18.0" />
          </font>
        </Label>
            <GridPane layoutX="-2.0" layoutY="-3.0" prefHeight="407.0" prefWidth="659.0">
              <columnConstraints>
                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
              </columnConstraints>
              <rowConstraints>
                <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
              </rowConstraints>
               <children>
                  <HBox prefHeight="134.0" prefWidth="654.0" spacing="20.0" GridPane.rowIndex="1">
                     <children>
                        <Button mnemonicParsing="false" prefHeight="46.0" prefWidth="60.0" text="Click me" wrapText="true" />
                        <Button mnemonicParsing="false" prefHeight="47.0" prefWidth="73.0" text="No, click me" wrapText="true" />
                        <Button mnemonicParsing="false" prefHeight="46.0" prefWidth="120.0" text="Don't you dare click me" wrapText="true" />
                     </children>
                     <padding>
                        <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
                     </padding>
                  </HBox>
                  <TextField promptText="Type something here..." GridPane.columnIndex="1" GridPane.rowIndex="1">
                     <GridPane.margin>
                        <Insets left="20.0" right="20.0" />
                     </GridPane.margin>
                  </TextField>
               </children>
            </GridPane>
      </children>
    </AnchorPane>
  </children>
</VBox>

这实际上是所需要的全部。如果我尝试运行程序并使对话框显示,则异常

java.lang.NullPointerException: Location is required.

是给定的。如果我将FXML文件移动到与主类相同的包中,即measurements.gui,并将ElementsProperties.java类的show-method中的文件路径更改为“testwindow.FXML”,那么所有操作都很正常,并且我可以在应用程序中看到创建的窗口。但我希望将fxml文件放在seperate resource文件夹中,以便插入其他fxml文件。

我希望我能把我的问题解释清楚,你能帮我解决这个问题。关于如何从不同于主类的包加载fxml文件,有什么想法吗?顺便说一句,我已经试过了:

  1. 将资源文件夹添加到类路径
  2. 将路径设置为“/resources/testwindow.fxml”(开头有正斜杠
  3. 使用getClass().getClassLoader().getResource(filePath)作为FXMLLoader的load方法的参数

提前谢谢你。

共有1个答案

姜学海
2023-03-14

谢谢Roland你的链接。我已经尝试复制文件夹结构,并想出了以下内容(对于可能有相同问题的其他人):

我创建了一个测试项目JavaFXTest。我在org.example.main包中有一个主类。包通常在项目的src文件夹中。

myJavaFxDialog.java:

package org.example.main;

import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class MyJavaFXDialog extends Application{

    public void start(Stage primaryStage) {

    MyJavaFXDialog javaFx = new MyJavaFXDialog();
    BorderPane root = javaFx.loadFXMLFile("/resources/TestWindow.fxml");

    Stage dialog = new Stage();
    dialog.initModality(Modality.WINDOW_MODAL);
    dialog.setScene(new Scene(root));
    dialog.show();
    }

    @SuppressWarnings({ "finally", "static-access" })
    private BorderPane loadFXMLFile(String filePath) {
    BorderPane borderPane = null;
    try {
        borderPane = new BorderPane();
        FXMLLoader fxmlLoader = new FXMLLoader();
        Parent content = fxmlLoader.load(getClass().getResource(filePath));
        borderPane.setCenter(content);
    }
    catch (IOException e) {
        e.printStackTrace();
        System.err.println("Couldn't find the specified file");
    }
    catch(Exception e){
        e.printStackTrace();
    }
    finally {
        return borderPane;
    }
    }

    public static void main(String[] args){
    launch(args);
    }
}

再一次,谢谢你,罗兰,你给我指点了那个解决方案

 类似资料:
  • 我试图加载FXML文件并将其显示为应用程序窗口,但出现异常。FXML文件是由FXML场景生成器创建的。 这是这门课的代码 和FXML文件 这是我得到的一个例外 我做错了什么? p、 这是项目结构

  • 我在从不同的包加载fxml文件时遇到问题。 加载FXML文件播放区的我的类。java看起来像这样: 我的fxml文件是FXMLDocument。fxml 编辑: 错误消息:

  • 我正在用JavaFX构建一个应用程序,并为布局加载FXML文件。开始时,我的所有.fxml文件都在java类路径中。 由于我正在制作一个游戏引擎,所以我决定将所有的东西都移到类路径之外,所以我现在有了一个文件系统,如下所示: 这就是我加载FXML的方式 它看起来可能并不漂亮,但它可以工作(system.getProperty(“jdir”)只是.jar在光盘上的位置)。Java查找每个文件(FXM

  • 我正在从事一个JavaFX8(maven)项目。我想在sources(而不是resources)文件夹中存储一个fxml文件 当我将fxml存储到location/src/main/resources/views/b/MyFxml时。fxml我使用命令加载它时没有错误, 有没有办法从/src/main/java/package/name/RoleView加载我的fxml文件。fxml位置?

  • 我正在处理一个JavaFX8(maven)项目。我想在sources(而不是resources)文件夹中存储fxml文件。 当我将fxml存储到位置/src/main/resources/views/b/myfxml.fxml时, 有没有办法从/src/main/java/package/name/roleview.fxml位置加载我的fxml文件?

  • 我正在尝试创建javafx applet,使用IntelliJ idea。构建之后,我得到了三个文件:.jar、.jnlp和.html。如果我启动jar所有工作都很好,但是如果我尝试使用jnlp或html运行app,它会抛出异常: 为什么会这样?Jar正好包含所需的位于指定路径的fxml。 Java: FXML: 我做错了什么?请帮帮忙。