我是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.
它表示该文件不存在,但它存在于具有完全相同名称的该文件夹中!它与代码在同一个包中。谁知道发生了什么事?! 提前谢谢
答案 0 :(得分:11)
当FXMLLoader由于缺少资源而无法完全构建场景图时,JavaFX会抛出异常javafx.fxml.LoadException: No resources specified.
。
这可能由于各种原因而发生。我因为以下原因遇到了它:
ResourceBundle
中的资源,但FXMLLoader
未正确配置ResourceBundle
。在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。
扩展名是必需的,因为这是构造文件名的方式。如果没有扩展名,则无法识别该文件,从而导致您众所周知的异常。
希望能阻止他人花费数小时做研究......