Исключение метода запуска приложения - JavaFX - PullRequest
0 голосов
/ 05 ноября 2018

Я хотел бы сказать, что я много смотрел в SO, и ни один из постов не помог мне, поэтому я спрашиваю снова ...

Я пытаюсь создать экран входа в систему, но все равно получаю то же исключение. Моя структура каталогов выглядит так: проверьте здесь

Мой код выглядит так:

    public class main extends Application {

        @Override
        public void start(Stage stage) throws Exception {
            Parent root = FXMLLoader.load(getClass().getResource("fxml/loginScene.fxml"));
          //Parent root = FXMLLoader.load(getClass().getResource("../login/login.fxml"));
          //Parent root = FXMLLoader.load(getClass().getResource("login.fxml"));
          //Parent root = FXMLLoader.load(getClass().getResource("src/relativepath//login/login.fxml"));
          //Parent root = FXMLLoader.load(getClass().getResource("/home/somepath/src/relativepath/login/login.fxml"));
          //Parent root = FXMLLoader.load(getClass().getResource("fxml/loginScene.fxml"));

            stage.setScene(new Scene(root));
            stage.show();
        }

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

Это исключение, которое я получаю:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    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(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
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$154(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
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 br.com.fulltime.fullcam.mosaicoDesktop.main.Main.start(Main.java:12)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$48(GtkApplication.java:139)
    ... 1 more

Все, что я прочитал до сих пор, говорит: «Вот почему FXML не может найти контроллер!», Поэтому я проверил, и все действительно хорошо. Вот выражение контроллера:

fx:controller="br.com.mycompany.myproduct.module.login.controllerLogin">

Я думаю, что эту информацию можно запросить:

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

На самом деле, вы получаете NPE. Попробуйте отладить, тогда вы можете попробовать это:

public void start(Stage stage) throws Exception {
    FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/fxml/loginScene.fxml"));
    Parent root = loader.load();
    stage.setScene(new Scene(root));
    stage.show();
}
0 голосов
/ 05 ноября 2018

Есть несколько способов сделать это. Я предпочитаю метод 1, так как он кажется мне более простым.

Для загрузки ресурса вам необходимо знать путь. Контроллеры знают свой собственный путь, поэтому я использую их.

Например, если у меня есть иерархия java/hypnic/jerk/controllers/ с файлом MainController.java, и я хочу загрузить файл FXML, который будет использовать этот файл Java в качестве контроллера, я добавлю его в resources/hypnic/jerk/controllers/. Затем, когда я звоню FXMLLoader.load();, я делаю это так:

FXMLLoader.load(MainController.class.getResource("mainScreen.fxml"));

Из того, что я понимаю и как я это вижу, это говорит загрузчику использовать путь, указанный в MainController, и извлечь файл mainScreen.fxml из пути туда.

Это, на мой взгляд, самый простой способ сделать это, поскольку он заставляет вас соблюдать соглашения об именах И вы знаете, где находится каждый файл FXML для соответствующего файла контроллера.

Вы также можете использовать путь, чтобы найти его, в вашем случае ваш loginScene.fxml находится в папке fxml/, поэтому с Main я бы сделал

FXMLLoader.load(getClass().getResource("../../../../fxml/loginScene.fxml"));

../ означает, перейдите на один каталог / папку. Поэтому, в зависимости от того, как элементы, которые вы вычеркнули, помните, что каждая . является новой папкой с таким именем, вам нужно добавить ../, пока вы не вернетесь в папку java.

Позволяет использовать ваш пример с путем java/br/com/one/two/three/main/. Поскольку ваш код говорит getClass().getResource("fxml/loginScene.fxml"), вы ищете этот файл в папке resources/br/com/one/two/three/fxml/. Путь основан на вызывающем классе Main.java, поэтому он не может найти его, потому что путь в resources не существует.

Так что вам нужно отойти от этих каталогов, используя ../, пока не дойдете до него. каждый ../ представляет другой уровень вверх. Так что в этом случае, если я правильно выполнил свою математику, вам понадобится 5 ../, чтобы найти файл fxml/loginScene.fxml. Таким образом, конечный результат будет

FXMLLoader.load(getClass().getResource("../../../../../fxml/loginScene.fxml"));

Теперь помните, что это просто объяснение, и вам придется адаптировать его самостоятельно.

Надеюсь, это помогло.

...