如何在 DefaultButton 操作之前使用 KeyPressed 事件?

我很难消费一个onKeyPressed事件。TextField我的应用程序中有一个允许用户按 [ENTER] 键来实现某个功能;但是,我也为场景指定了一个默认按钮。


虽然我可以成功触发在 中按下的键所需的操作,但TextField始终首先执行默认按钮的操作。当用户在TextField.


请参阅以下 MCVE:


import javafx.application.Application;

import javafx.geometry.Insets;

import javafx.geometry.Pos;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.control.ButtonBar;

import javafx.scene.control.TextField;

import javafx.scene.input.KeyCode;

import javafx.scene.layout.VBox;

import javafx.stage.Stage;


public class Main extends Application {


    public static void main(String[] args) {

        launch(args);

    }


    @Override

    public void start(Stage primaryStage) {


        // Simple UI

        VBox root = new VBox(10);

        root.setPadding(new Insets(10));

        root.setAlignment(Pos.CENTER);


        // TextField

        TextField textField = new TextField();


        // Capture the [ENTER] key

        textField.setOnKeyPressed(event -> {

            if (event.getCode() == KeyCode.ENTER) {

                System.out.println("-> Enter");

                event.consume();

            }

        });


        // Buttons

        Button btnCancel = new Button("Cancel");

        btnCancel.setCancelButton(true);

        btnCancel.setOnAction(e -> {

            System.out.println("-> Cancel");

            primaryStage.close();

        });


        Button btnSave = new Button("Save");

        btnSave.setDefaultButton(true);

        btnSave.setOnAction(e -> {

            System.out.println("-> Save");

            primaryStage.close();

        });


        ButtonBar buttonBar = new ButtonBar();

        buttonBar.getButtons().addAll(btnCancel, btnSave);


        root.getChildren().addAll(textField, buttonBar);


        primaryStage.setScene(new Scene(root));

        primaryStage.setTitle("Consume Event");

        primaryStage.show();

    }

}

所需的行为是能够textField输入并按回车键。输出应仅显示-> Enter,舞台应保留。


但是,当前发生的是该阶段以以下输出结束:


-> Save

-> Enter

我event.consume()在错误的地方打电话吗?我想保持默认按钮不变。


慕慕森
浏览 159回答 2
2回答

largeQ

正如文档所述:Windows / Linux:默认按钮在获得焦点时接收 ENTER 键。当默认按钮没有焦点,并且焦点在另一个 Button 控件上时,按下 ENTER 键将被另一个非默认 Button 接收。当焦点位于用户界面的其他地方,而不是任何按钮上时,如果指定了一个按钮,并且场景中没有其他节点首先使用它,则默认按钮将接收按 ENTER 键。所以我相信这是一个错误。正如我在评论中所说,一种解决方法是检查 TextField 是否在您的默认按钮的 setOnAction 内具有焦点并在那里使用该事件,直到他们修复它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java