JavaFx SceneBuilder - Невозможно обновить текст метки - NullPointerException - PullRequest
0 голосов
/ 19 сентября 2019

Как мне его загрузить:

public class App extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader();
        Parent root = loader.load(new File("src/dreambot/guis/XPTracker.fxml").toURI().toURL());
        Controller l = (Controller) loader.getControllerFactory();
        primaryStage.setTitle("XP Tracker");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
        l.setAtkXph(23233);
    }

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

Контроллер

public class Controller {
    @FXML
    Label atkXph;

    public void setAtkXph(int num) {
        atkXph.setText(num + "/h");
    }
}

Основной (String [] args) метод

public class Tests {
    public static void main(String[] args) {
        new App().build(args);
    }
}

Метка в моем fxml:

<Label id="atkXph" fx:id="atkXph" layoutX="68.0" layoutY="71.0" text="0/h" />

Моя ошибка:

Exception in Application start method
Exception in thread "main" 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$159(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
    at dreambot.main.App.start(App.java:23)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$166(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$179(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$177(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$178(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$152(WinApplication.java:177)
    ... 1 more

1 Ответ

1 голос
/ 19 сентября 2019

Контроллер и фабрика контроллеров - это две разные вещи:

Контроллер - это объект, который содержит методы, используемые с #methodName значениями атрибутов и полями, в которые загрузчик вводит объекты на основе fx:id s.

Фабрика контроллера используется для создания контроллера, если вы назначаете его ему.

controllerFactory.call(Class.forName(<fx:controller attribute value>))

используется FXMLLoader для создания экземпляра класса контроллера, если вы назначаете Callback перед загрузкой fxml.

Кроме того, вы используете один из методов static load.Таким образом, создается второй экземпляр FXMLLoader, к которому вы не можете получить доступ и который используется для загрузки fxml.Вам нужно указать URL как местоположение перед загрузкой fxml.

FXMLLoader loader = new FXMLLoader(new File("src/dreambot/guis/XPTracker.fxml").toURI().toURL()); // maybe replace with resource access (getClass().getResource("/dreambot/guis/XPTracker.fxml"))?
Parent root = loader.load();
Controller l = loader.getController();

Также вы не можете создать экземпляр класса Application самостоятельно и использовать стандартный способ запуска.Application.launch всегда создает новый экземпляр класса приложения.В этом случае создание build метода static будет служить той же цели, но вы также можете указать класс приложения, используя перегруженную версию launch:

Application.launch(App.class, args);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...