为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕慕森 2021-06-01 09:58:41
我很难消费一个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()在错误的地方打电话吗?我想保持默认按钮不变。
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

正如文档所述:

Windows / Linux:默认按钮在获得焦点时接收 ENTER 键。当默认按钮没有焦点,并且焦点在另一个 Button 控件上时,按下 ENTER 键将被另一个非默认 Button 接收。当焦点位于用户界面的其他地方,而不是任何按钮上时,如果指定了一个按钮,并且场景中没有其他节点首先使用它,则默认按钮将接收按 ENTER 键。

所以我相信这是一个错误。正如我在评论中所说,一种解决方法是检查 TextField 是否在您的默认按钮的 setOnAction 内具有焦点并在那里使用该事件,直到他们修复它。


查看完整回答
反对 回复 2021-06-02
  • 2 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信