javaFX应用程序错误:未指定资源

时间:2013-07-04 07:18:15

标签: java javafx

我是javaFX的新手,我正在尝试运行一个简单的应用程序。它的UI是用javaFX场景构建器创建的,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.

它表示该文件不存在,但它存在于具有完全相同名称的该文件夹中!它与代码在同一个包中。谁知道发生了什么事?! 提前谢谢

2 个答案:

答案 0 :(得分:11)

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

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

  1. 加载fxml文件中指定的控制器时出错。
  2. fxml文件尝试引用ResourceBundle中的资源,但FXMLLoader未正确配置ResourceBundle
  3. 在JavaFX中抛出此异常可能还有其他原因,但根本原因是由于某种原因,FXMLLoader在尝试从fxml文件创建场景图时遇到异常。

答案 1 :(得分:1)

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

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

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

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

我编写了一个私有资源加载器帮助程序,它将通过获取Object和Locale来实现这一目的。当然,我使用从我的设置构造的语言环境,而不是常量,但我想保持简单。

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

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

希望能阻止他人花费数小时做研究......