我很难消费一个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 内具有焦点并在那里使用该事件,直到他们修复它。
添加回答
举报
0/150
提交
取消