7

我是 javaFX 新手,我正在尝试运行一个简单的应用程序。它的 UI 是使用 javaFX scenebuilder 创建的,Main 类应该显示 UI,仅此而已。

public class Main extends Application {

    public static void main(String[] args) {
        launch(Main.class, (String[])null);
    }

@Override
public void start(Stage primaryStage) {;
    try {
        AnchorPane root=(AnchorPane)FXMLLoader.load(Main.class.getResource("Main.fxml"));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Issue Tracking Lite Sample");
        primaryStage.show();
    } catch (IOException e) {System.err.println(e);}

    }


}

运行应用程序时出现此错误:

No resources specified.

/D:/workspace/FileSharing_ServerSide/bin/com/Shayan/FileSharing/Server/Main.fxml:16
  at javafx.fxml.FXMLLoader$Element.processPropertyAttribute(FXMLLoader.java:305)
at javafx.fxml.FXMLLoader$Element.processInstancePropertyAttributes(FXMLLoader.java:197)
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:588)
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2430)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2136)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2742)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2721)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2707)
javafx.fxml.LoadException: No resources specified.

它说该文件不存在,但它以完全相同的名称存在于该文件夹中!它与代码在同一个包中。有人知道发生了什么吗?!提前致谢

4

2 回答 2

12

javafx.fxml.LoadException: No resources specified.当 FXMLLoader 由于缺少资源而无法完全构建场景图时,JavaFX 会引发异常。

这可能由于多种原因而发生。我遇到它是因为以下原因:

  1. 加载 fxml 文件中指定的控制器时出错。
  2. fxml 文件尝试引用 a 中的资源,ResourceBundleFXMLLoader没有ResourceBundle正确配置。

从 JavaFX 中引发此异常的原因可能还有其他原因,但根本原因是由于某种原因,FXMLLoader 在尝试从 fxml 文件创建场景图时遇到了异常。

于 2013-11-26T20:31:52.257 回答
1

要获取资源,您必须指定完整 (!) 基本名称。也就是说,与之前的所有包。

如果资源文件与控制器类具有相同的 bas 名称(这很合理,因为它有助于将所有东西放在一起),您可以通过以下方式执行此操作:

  String className = this.getClass().getCanonicalName();
    // @formatter:off
    ResourceBundle languageResource = 
            ResourceBundle.getBundle(className, Locale.GERMAN);
    // formatter:on

    Object objPane = FXMLLoader.load(fxmlUrl, languageResource);

我编写了一个私有资源加载器助手,它可以通过获取对象和语言环境来解决问题。当然,我使用的是根据我的设置构建的语言环境,而不是常量,但我想让事情变得简单。

对于资源文件的名称:由于我的类名为MainWindow,资源文件(在同一个包中)是MainWindow_de.properties(其中“de”是语言的一部分,所以我也有一个MainWndow_en.properties在包裹。

扩展名是必需的,因为这是构建文件名的方式。如果没有扩展名,将无法识别该文件,从而导致您众所周知的异常。

希望这可以防止其他人花费数小时进行研究...

于 2017-11-28T18:04:44.240 回答