gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:19:24 24 4
gpt4 key购买 nike

我很难使用 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()?我想保持默认按钮不变。

编辑:

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

提交的错误报告:View Bug Report

最佳答案

如文档所述:

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

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

关于java - 如何在 DefaultButton 操作之前使用 KeyPressed 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51388408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com