FXML文件导致应用程序无法打开

时间:2017-02-20 07:22:03

标签: java eclipse javafx fxml

我正在关注PluralSite的这个课程,我正在复制代码,然而他正在使用netbeans并且我使用eclipse而且我无法弄清楚发生了什么。使用netbeans和ecplise使用fxml文件时有区别吗?如果有人可以提供帮助,我会赞不绝口。如果您需要更多信息,请务必提出帮助。我是javafx的新手,所以要好。 fxml文件与其他文件位于同一个包中:

这是我得到的异常,然后是应用程序代码,然后是fxml代码

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at application.SimpleUI.start(SimpleUI.java:18)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    ... 1 more
Exception running application application.SimpleUI





  //first is my app
    package application;

    import java.io.IOException;

    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;

    public class SimpleUI extends Application {
        @Override
        public void start(Stage primaryStage) throws Exception {
            HBox box =        FXMLLoader.load(getClass().getResource("/hey/src/application/simpleui.fxml"));

    //      VBox vBox = new VBox(new Label("This goes down"), new Button("Down"), new Button("Further Down"));
    //
    //      box.getChildren().addAll(new Label("UserName"), new TextField(), new Button("Connect"), vBox);

            Scene scene = new Scene(box);
            primaryStage.setScene(scene);
            primaryStage.show();
        }

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



    //this is my fxml code
    import java.io.IOException;

    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;

    public class SimpleUI extends Application {
        @Override
        public void start(Stage primaryStage) throws Exception {
            HBox box = FXMLLoader.load(getClass().getResource("/hey/src/application/simpleui.fxml"));

    //      VBox vBox = new VBox(new Label("This goes down"), new Button("Down"), new Button("Further Down"));
    //
    //      box.getChildren().addAll(new Label("UserName"), new TextField(), new Button("Connect"), vBox);

            Scene scene = new Scene(box);
            primaryStage.setScene(scene);
            primaryStage.show();
        }

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




<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import java.scene.*?>
<?import java.scene.control.*?>
<?import java.scene.layout.*?>

<?import javafx.scene.layout.*?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>

<HBox>
    <children>
        <Label text= "UserName" />
        <TextField />
        <Button text= "Connect" /> 
    </children>
</HBox>

修正:我已经解决了问题,感谢回答我问题的人

1 个答案:

答案 0 :(得分:0)

我不确定这会解决您的问题,但我在加载fxml文件和您发布的代码的典型方式之间看到的一个区别就是加载器中的路径:

        HBox box = FXMLLoader.load(getClass().getResource("/hey/src/application/simpleui.fxml"));

我正式加载fxml:

        AnchorPane page = (AnchorPane) FXMLLoader.load(PreloadController.class.getResource("PreloaderGUI.fxml"));

确保我的Controller和fxml文件位于同一个包中。我假设这些示例之间的getResource方法是相同的,但传递的String路径是不同的。尝试将其更改为fxml文件的名称,看看它是否有效。即如下:

    HBox box = FXMLLoader.load(getClass().getResource("simpleui.fxml"));