JavaFX警报对话框忽略焦点按钮

时间:2015-04-30 05:19:18

标签: javafx alert

为什么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();
        }
    }
});

2 个答案:

答案 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();

就是这样。