作者:清明如月_213 | 来源:互联网 | 2022-12-10 13:25
我很难消耗一个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();
}
}
所需的行为是能够键入textField
并按Enter键.输出应该只显示-> Enter
,阶段应该保留.
但是,目前正在发生的是阶段关闭,输出如下:
-> Save
-> Enter
我是否event.consume()
在错误的地方接听电话?我想按原样保留默认按钮.
编辑:
这似乎只是JDK 10中的一个问题.我再次尝试使用JDK 1.8.161,它的行为符合要求.Java 10中可能存在的错误?
提交的错误报告:查看错误报告
1> JKostikiadis..:
正如文件所述:
Windows/Linux:默认Button在有焦点时接收ENTER键.当默认按钮没有焦点,并且焦点位于另一个按钮控件上时,按下ENTER键将被另一个非默认按钮接收.当焦点位于用户界面的其他位置而不是任何按钮时,如果指定了一个按钮,则默认按钮将接收按下ENTER键,并且如果场景中没有其他节点首先消耗它.
所以我相信这是一个错误.正如我在评论中所说,解决方法是检查TextField是否在befault按钮的setOnAction中有焦点并在那里使用事件,直到他们修复它.