【问题标题】:JavaFx SceneBuilder - Cannot update Label text - NullPointerExceptionJavaFx SceneBuilder - 无法更新标签文本 - NullPointerException
【发布时间】:2019-09-19 11:30:22
【问题描述】:

我如何加载它:

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");
    }
}

Main(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

【问题讨论】:

标签: java user-interface javafx


【解决方案1】:

控制器和控制器工厂是两个不同的东西:

控制器是包含与#methodName 属性值和字段一起使用的方法的对象,加载程序根据fx:ids 将对象注入到这些字段中。

控制器工厂用于创建控制器,如果您为其分配一个控制器。

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

FXMLLoader 使用它来创建控制器类的实例,如果您在加载 fxml 之前分配了 Callback

此外,您使用static load 方法之一。这样,您无法访问的第二个 FXMLLoader 实例将被创建并用于加载 fxml。在加载 fxml 之前,您需要指定 URL 作为位置。

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);

【讨论】:

    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2014-11-22
    相关资源
    最近更新 更多