为什么JavaFX警报对话框会触发Platform.exit();当我按下Enter键时,即使警告对话框中的聚焦按钮是取消?
soaStage.setOnCloseRequest(new EventHandler<WindowEvent>()
{
@Override
public void handle(WindowEvent event)
{
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Confirm");
alert.setHeaderText("Are you sure you want to exit?");
alert.setContentText("Press OK to exit, or Cancel to stay.");
alert.initOwner(soaStage);
Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK)
{
Platform.exit();
}
else
{
event.consume();
}
}
});
答案 0 :(得分:6)
默认按钮在上输入
按输入时会触发确定按钮,因为它是default button。
如果场景中没有其他节点消耗它,则默认按钮是接收键盘VK_ENTER的按钮。
在默认的JavaFX 8 Modena样式表中,默认按钮用蓝色表示,而不是标准按钮的灰色。
如何删除默认按钮行为
您可以通过不将“确定”按钮设为默认按钮来从警告对话框中删除此行为:
Button okButton = (Button) alert.getDialogPane().lookupButton(ButtonType.OK);
okButton.setDefaultButton(false);
我建议你不要这样做,而是始终在警告对话框中留下默认按钮。
在OS X上,标准警报类型对话框有一个默认按钮,即使另一个按钮被聚焦,也会被 enter 触发,因此JavaFX中的标准行为与此一致。注意:要在OS X的默认对话框中允许此行为,必须enable full keyboard access。
如果您确定将确定按钮更改为默认按钮,我建议您将其文本更改为其他内容(例如,退出您的案例):
okButton.setText("Exit");
如何让输入点火按钮
现在,如果您还希望按输入时触发聚焦按钮,则可以执行此操作:
EventHandler<KeyEvent> fireOnEnter = event -> {
if (KeyCode.ENTER.equals(event.getCode())
&& event.getTarget() instanceof Button) {
((Button) event.getTarget()).fire();
}
};
DialogPane dialogPane = alert.getDialogPane();
dialogPane.getButtonTypes().stream()
.map(dialogPane::lookupButton)
.forEach(button ->
button.addEventHandler(
KeyEvent.KEY_PRESSED,
fireOnEnter
)
);
注意:在任何情况下,按 space 时总是会触发聚焦按钮。
答案 1 :(得分:0)
我们可以通过创建一个在应用程序启动时需要实例化一次的类来将 ENTER 绑定添加到整个按钮。
public class EnableButtonEnterKey extends ButtonBehavior<Button> {
public EnableButtonEnterKey() {
super(new Button());
BUTTON_BINDINGS.add(new KeyBinding(ENTER, KEY_PRESSED, "Press"));
BUTTON_BINDINGS.add(new KeyBinding(ENTER, KEY_RELEASED, "Release"));
}
}
启动应用程序时,请致电
new EnableButtonEnterKey();
就是这样。