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

在JavaFX对话框中控制ESC键操作

高迪
2023-03-14

我有一个JavaFX应用程序,它最初将显示一个登录对话框,供用户输入用户名和密码。请参阅下面的源代码

如果用户单击“连接”按钮,应用程序将使用输入的用户名和密码执行登录,隐藏登录对话框,然后显示主窗口。

如果用户点击“退出”按钮或“X”关闭按钮,将显示一个警报以获得用户的确认。如果用户确认,则应用程序退出。

我的问题是当登录对话框显示时用户按Escape键会发生什么。当按下此键时,将显示退出确认警报,然后立即关闭。因此,我们看到的是退出确认对话框,只要按下Escape键,就会立即显示出来。

为什么会出现这种情况?

我想按下Escape键相当于点击“退出”或“X”按钮。也就是说,当按下Escape键时,将显示退出确认对话框。

或者,是否可以完全禁用Escape键?

提前道谢。

public class TestApp extends Application {

    private Stage primaryStage;

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

    @Override
    public void start(Stage stage) throws Exception {
        this.primaryStage = stage;
        HBox pane = new HBox();
        pane.setAlignment(Pos.CENTER);
        Scene scene = new Scene(pane, 300, 300);
        stage.setScene(scene);
        showLoginDialog();
    }

    public void showLoginDialog() {
        Dialog<String> loginDialog = new Dialog<>();
        loginDialog.setTitle("Login");
        loginDialog.setHeaderText("Enter User Name and Password to login.");
        loginDialog.setResizable(false);
        Label userNameLabel = new Label("User Name:");
        Label passwordLabel = new Label("Password:");
        TextField userNameField = new TextField();
        userNameField.setMaxWidth(Double.MAX_VALUE);
        PasswordField passwordField = new PasswordField();
        passwordField.setMaxWidth(Double.MAX_VALUE);
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(20, 35, 20, 35));
        grid.add(userNameLabel, 1, 1);
        grid.add(userNameField, 2, 1);
        grid.add(passwordLabel, 1, 2);
        grid.add(passwordField, 2, 2);
        loginDialog.getDialogPane().setContent(grid);
        loginDialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
        loginDialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);
        Button connectButton = (Button) loginDialog.getDialogPane().lookupButton(ButtonType.OK);
        connectButton.setText("Connect");
        connectButton.addEventFilter(ActionEvent.ACTION, event -> {
            // perform login here
            loginDialog.hide();
            primaryStage.show();
            event.consume();
        });
        Button exitButton = (Button) loginDialog.getDialogPane().lookupButton(ButtonType.CANCEL);
        exitButton.setText("Exit");
        exitButton.addEventFilter(ActionEvent.ACTION, event -> {            
            handleExit();
            event.consume();
        });
        Stage stage = (Stage) loginDialog.getDialogPane().getScene().getWindow();
        stage.setOnCloseRequest(event -> {
            handleExit();
            event.consume();
        });
        stage.show();
    }

    private void handleExit() {
        Alert alert = new Alert(AlertType.CONFIRMATION, "", ButtonType.YES, ButtonType.NO);
        alert.setHeaderText("Confirm exit?");
        alert.resultProperty().addListener((observable, previous, current) -> {
            if (current == ButtonType.YES) {
                System.exit(1);
            }
        });
        alert.show();
    }

}

共有1个答案

华英睿
2023-03-14

看看这是否有什么不同:

private void handleExit() {
    Alert alert = new Alert(AlertType.CONFIRMATION, "", ButtonType.YES, ButtonType.NO);
    alert.setHeaderText("Confirm exit?");

    Optional<ButtonType> result = alert.showAndWait();
    if(result.get() == ButtonType.YES)
    {
         Platform.exit();
    }

    alert.show();
}
 类似资料:
  • 问题内容: 使用Swing开发GUI。 我有一个自定义对话框,用于选择要在应用程序中打开的文件。它的类扩展并包含a和其他组件,可以将其切换为显示或隐藏。 该组件已经可以单独处理ESC键:当显示文件选择器(嵌入在我的对话框中)并且按ESC时,文件选择器将隐藏自身。 现在,我希望对话框执行相同的操作:当我按ESC时,我希望对话框关闭。请注意,当显示嵌入式文件选择器时,ESC键应仅将其隐藏。 有任何想法

  • 我尝试了很多我在网上看到的不同东西,但我什么都做不了。我只需要一个简单的对话框,当你点击菜单中的退出按钮并询问“您确定要退出吗?”并提供一个有效的“是的,我确定。”和“不,取消”按钮。

  • 我在JavaFX的一个阶段中创建了一个按钮(名为test)。然后,当你按下这个按钮时,我会显示一个对话框,其中还有一个按钮(目前这并不重要)。现在,我希望对话框可以让我冻结整个应用程序。我的意思是,我不应该回到前一阶段,我可以这样做,只需用“X”关闭窗口。

  • 我正在学习如何在javafx中创建对话框,我写了一段代码,这给了我一个问题。错误在createLoginDialog方法中。 错误为“无法访问TryDialogBox类型的封闭实例。必须用TryDialogBox类型的封闭实例限定分配(例如x.new A(),其中x是TryDialogBox的实例)。

  • 我正在编写一个javafx程序,我需要创建和使用我自己的Stage based (Javafx。Stage)对话框,用于显示消息和确认。到目前为止,我已经编写了所有必要的代码,但是我有一个问题: 对话框必须停止执行其余代码,直到给出类似“是”或“否”或“重试”之类的响应。当我使用我的对话框,如“DialogBox.ShowMessage”时,会出现一个带有消息和按钮的阶段。但是,正如您可能认为的那

  • 我正在使用新的JavaFX Alert类(Java1.8_40),并尝试在exibition文本中使用HTML标记,但到目前为止还没有成功。下面是我正在尝试做的一个例子。 有没有人知道这是不是真的可能,给我举个例子? 提前道谢。