当前位置: 首页 > 知识库问答 >
问题:

无法更改JavaFX中警报窗口的initModality

司寇羽
2023-03-14

在JavaFX(11)中,我试图在主窗口上方显示一个警报窗口,但我不希望主窗口是可单击的。为此,我认为必须更改警报窗口的initModality(https://docs.oracle.com/javafx/2/api/javafx/stage/stage.html参见'modality')。是否因为警报窗口的所有者为NULL而无法工作?

这是我的控制器类。main类只是IntelliJ IDEA生成的缺省JavaFX main类,.fxml文件只是一个带按钮的anchorpane以供测试。

package sample;

import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.stage.Modality;

public class Controller {

    public Button button;

    public void initialize(){
        Alert alert = new Alert(Alert.AlertType.ERROR);
        System.out.println(alert.getOwner());             //output: null
        alert.initModality(Modality.APPLICATION_MODAL);
        alert.setHeight(200);
        alert.setWidth(300);
        alert.show();
        button.setOnAction(push -> System.out.println("button pressed")); //button is still pressable
    }
}

共有1个答案

丌官淇
2023-03-14

我认为问题是窗口显示的顺序。在Windows10(使用JavaFX 12.0.1)上使用以下方法进行测试,重现了该问题:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        var alert = new Alert(AlertType.INFORMATION);
        alert.initModality(Modality.APPLICATION_MODAL);
        alert.setHeaderText(null);
        alert.setContentText("This is a test of application modality.");
        alert.show();

        primaryStage.setScene(new Scene(new StackPane(new Label("Hello, World!")), 500, 300));
        primaryStage.show();
    }

}

上面的结果是一个对话框窗口不是正确的模式。但是,如果将alert.show()移动到primarystage.show()之后,所有操作都按预期进行。

由于您在FXML控制器的initialize()方法中显示警报,因此很可能在显示主窗口之前执行了代码。如果要在应用程序的开始处显示警报,至少有两个选项:

    null

控制器类中添加一个方法,并在显示其他窗口后调用它。

@Override
public void start(Stage primaryStage) throws IOException {
    FXMLLoader loader = new FXMLLoader(/*location*/);
    primaryStage.setScene(new Scene(loader.load()));
    primaryStage.show();
    loader.<Controller>getController().showMyAwesomeAlert();
}
 类似资料:
  • 我们正在构建一个flink用例,在这个用例中,我们从一个kafka主题进行消费,并根据平均、最大和最小阈值执行聚合和生成警报。我们还需要在翻滚事件时间窗口中有0个事件时通知每个键。我们很难想出一个同样的解决方案。我们考虑的选项如下,如果有其他想法我们还没有考虑,请告诉我们。 < li >可查询状态:保存每个过程窗口功能中的键。从外部应用程序查询状态,并在20分钟时间间隔到期后某个密钥丢失时发出警报

  • 我在用Python编写的Apache Beam管道中处理分析命中。我使用的是10分钟的FixedWindows,当窗口为空时,我希望触发警报(例如,使用Cloud Pub/sub)。到目前为止,我所做的是:

  • 你好,我有一个应用程序有警报,在用户没有响应后,我想刷新警报/再次显示它,但由于某些原因,我没有看到第二个警报,它是空的,像: 我关闭警报,如果它显示,所以我不知道为什么下一个警报是空的。包装应用;

  • 问题内容: 我需要在 警报 框中更改“确定”按钮的样式。 问题答案: 警报框是系统对象,不受CSS约束。为此,您需要创建一个HTML元素并模仿其功能。jQuery UI Dialogue为您做了很多工作,基本上就像我描述的那样:Link。

  • 我正在尝试一个简单的Java FX程序,它可以创建一个窗口,我所需要的只是增加读取已删除文件的能力。我得到了以下代码片段,它不会抛出任何错误,但也不允许我删除任何内容。当我试图删除文件时,它会显示一个红色光标(不允许使用windows光标) 我使用的是Windows 8机器和JDK 8.0_60版。不确定问题出在哪里。代码有问题吗?我错过什么了吗? 我试过的- 已尝试更改传输模式 尝试检查文件权限

  • 我想知道如何使用子窗口更改父窗口中的某些内容。假设我有一个窗口,在按下按钮时,它会打开一个弹出窗口。这个新窗口包含一个JTextArea和另一个名为OK的按钮。当按下Ok按钮时,如何根据JTextArea中的内容更改父窗口的标题?