您如何使ENTER全局触发JavaFX的onAction?

问题描述 投票:0回答:1

我在另一个问题中看到,这是您想按Enter触发onAction的解决方案

    btn.defaultButtonProperty().bind(item_btn.focusedProperty());

是否有办法针对所有按钮全局执行此操作,或者我必须初始化每个组件并遍历每个按钮并以这种方式绑定它?

javafx javafx-8 javafx-11 javafx-css
1个回答
0
投票

您可以在场景中注册事件处理程序,并检查按钮是否具有焦点:

Scene scene = ... ;
scene.addEventHandler(KeyEvent.KEY_PRESSED, e -> {
    if (e.getCode() == KeyCode.ENTER) {
        if (scene.getFocusOwner() instanceof Button) {
            Button button = (Button)scene.getFocusOwner();
            button.fire();
        }
    }
});

演示:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class App extends Application {

    @Override
    public void start(Stage stage) {

        HBox controls = new HBox(5);
        controls.getChildren().add(new TextField());
        for (int i = 1 ; i <=5 ; i++) {
            String text = "Button "+i ;
            Button button = new Button(text);
            button.setOnAction(e -> System.out.println(text));
            controls.getChildren().add(button);
        }

        Scene scene = new Scene(controls, 600, 400);
        scene.addEventHandler(KeyEvent.KEY_PRESSED, e -> {
            if (e.getCode() == KeyCode.ENTER) {
                if (scene.getFocusOwner() instanceof Button) {
                    Button button = (Button) scene.getFocusOwner();
                    button.fire();
                }
            }
        });


        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.