需要Javafx位置(从其他文件夹/包加载FXML文件)
我在使用Java处理FXML文件时遇到了一个问题 我现在搜索了几个小时,找不到任何能解决我问题的方法,所以我最后的希望是针对我的具体情况提出问题(我知道类似的问题和其他问题,但在这方面没有一个能真正帮助我) 简单解释:我有一个Eclipse Java项目,我的(对于这个问题很重要)类在包[Project Name]/src/measures.gui中。我的FXML文件在文件夹[Project Name]/resources中 加载FXML文件ElementsProperties.java的类如下所示:需要Javafx位置(从其他文件夹/包加载FXML文件),java,eclipse,nullpointerexception,javafx,fxml,Java,Eclipse,Nullpointerexception,Javafx,Fxml,我在使用Java处理FXML文件时遇到了一个问题 我现在搜索了几个小时,找不到任何能解决我问题的方法,所以我最后的希望是针对我的具体情况提出问题(我知道类似的问题和其他问题,但在这方面没有一个能真正帮助我) 简单解释:我有一个Eclipse Java项目,我的(对于这个问题很重要)类在包[Project Name]/src/measures.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文件显示为带有以下简单行的对话框:
elementsprroperties.show(父级,“测试窗口”);
我的FXML文件(使用JavaFXSceneBuilder 2.0创建)如下所示:
`
如果我将FXML文件移动到与主类相同的包中,即measurements.gui,并将ELementsProperties.java类的show方法中的文件路径更改为“TestWindow.FXML”
,一切正常,我在应用程序中看到了创建的窗口。但我想将fxml文件放在单独的资源文件夹中,以便插入其他fxml文件
我希望我能清楚地解释我的问题,你能帮我解决这个问题。关于如何从不同于主类的包中加载fxml文件,有什么想法吗?
顺便说一句,我已经尝试过的是:
getClass().getClassLoader().getResource(文件路径)
作为参数
对于FXMLLoader的加载方法提前谢谢。谢谢罗兰的链接。我试图复制文件夹结构,并提出了以下建议(适用于可能有相同问题的其他人): 我创建了一个测试项目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);
}
}
我在src文件夹中创建了一个普通文件夹“resources”。该资源文件夹只包含我的TestWindow.fxml文件,它与我上面的问题完全相同。
现在,当我启动应用程序时,fxml文件被找到并显示为主窗口
因此,解决方案实际上是将resources文件夹移动到src文件夹中,这对我来说仍然是一个可行的解决方案。我只是不希望最终用户不得不在其他包的深处翻找来保存自己的fxml文件
再次感谢Roland,为我指明了解决方案。我在这里的回答可能会有所帮助:……如果没有,请提供一个完整的可验证的例子,而不仅仅是你的一些问题。谢谢,@Roland!文件夹结构给了我所需的提示。对不起,如果我对我的问题不够清楚,我想我已经写了所有的东西了需要了解此问题。只需一条不相关的注释:
fxmloader.load(URL)
是一个静态方法;您没有在创建的fxmloader
实例上调用它(您从未实际使用过该实例)。您应该删除fxmloader
实例并以通常的方式调用静态方法:Parent content=fxmloader.load(…);
(或者在fxmloader
实例上设置位置并调用无参数load()
方法)。实际上,我认为fxmloader的静态加载方法是(预定的)不推荐使用。这就是我选择这种方法的原因。对此进行了讨论,但我不知道是否已经决定了(可能已经决定了)。尽管如此,您的代码仍然调用静态方法。哦,您是对的……将改变这一点。感谢您的提示。FWIW不会将静态方法显示为不推荐使用的(尽管这可能会改变-我希望会改变)。
java.lang.NullPointerException: Location is required.
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);
}
}