【问题标题】:NPE when calling initOwner on Alert (JavaFX)在警报上调用 initOwner 时的 NPE (JavaFX)
【发布时间】:2015-09-08 07:18:41
【问题描述】:

我正在编写一个显示Alert 的程序,我正在尝试调用initOwner 以便它使用应用程序图标,但我得到的是NullPointerException

这是一个最小的例子:

import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.stage.Stage;

public class AlertTest extends Application {
    @Override
    public void start(final Stage primaryStage) throws Exception {
        final Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.initOwner(primaryStage); // line 9
        alert.showAndWait();
    }

    public static void main(final String... args) {
        launch(args);
    }
}

以及相关的堆栈跟踪:

Caused by: java.lang.NullPointerException
    at javafx.scene.control.HeavyweightDialog.updateStageBindings(HeavyweightDialog.java:319)
    at javafx.scene.control.HeavyweightDialog.initOwner(HeavyweightDialog.java:120)
    at javafx.scene.control.Dialog.initOwner(Dialog.java:451)
    at AlertTest.start(AlertTest.java:9)

我做错了什么?

我在 Linux 中使用 Oracle 的 JDK 1.8.0_51。

【问题讨论】:

    标签: java javafx javafx-8


    【解决方案1】:

    您将获得NullPointerException,因为您没有将Scene 设置为主要阶段。

    public class Main extends Application {
    
        @Override
        public void start(final Stage primaryStage) throws Exception {
            final Alert alert = new Alert(Alert.AlertType.INFORMATION);
    
            primaryStage.setScene(new Scene(new Group(), 300, 300, Color.BLACK));
    
            alert.initOwner(primaryStage);
    
            alert.showAndWait();
        }
    
        public static void main(final String... args) {
            launch(args);
        }
    
    }
    

    【讨论】:

    • 所以即使我不使用主应用程序窗口,我也需要设置场景?
    • @aditsu 是的,你必须指定一个场景。
    • 好的,谢谢,顺便说一句new Scene(new Group()) 似乎足够了
    • 现在警报位置似乎受到了影响(它转到屏幕左上角),但我想这是另一个问题
    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 2016-08-10
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多