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

Zep*_*hyr 7 java javafx

我很难消耗一个onKeyPressed活动.TextField我的应用程序中有一个允许用户按[ENTER]键获取某个功能; 但是,我也有一个为场景指定的默认按钮.

虽然我可以成功触发按下键时所需的操作,但TextField始终先执行默认按钮的操作.当用户进入时,我需要完全为keypress使用事件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();
    }
}
Run Code Online (Sandbox Code Playgroud)

所需的行为是能够键入textField并按Enter键.输出应该只显示-> Enter,阶段应该保留.

但是,目前正在发生的是阶段关闭,输出如下:

-> Save
-> Enter
Run Code Online (Sandbox Code Playgroud)

我是否event.consume()在错误的地方接听电话?我想按原样保留默认按钮.

编辑:

这似乎只是JDK 10中的一个问题.我再次尝试使用JDK 1.8.161,它的行为符合要求.Java 10中可能存在的错误?

提交的错误报告:查看错误报告

JKo*_*dis 5

正如文件所述:

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

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