没有捕捉到JavaFX的按键

 2023-02-16    402  

问题描述

我正在尝试捕获关键按下事件(上下页面),但根本没有收到关键事件.这是相关代码:
构造函数:

private MainLayout() {
    imageView = new ImageView();
    root = new StackPane();

    root.getChildren().add(imageView);
    root.setFocusTraversable(true); //no effect
    //root.requestFocus(); //also no effect
    registerEvents();

}

关于焦点的两条线都没有效果.堆栈窗格直接添加到场景中.
除了场景 – > stackpane-> imageView之外,别无其他节点.
我能够在现场捕获关键事件,但是我需要在堆栈窗格中捕获它们

没有捕捉到JavaFX的按键

这是registerEvents(),所有其他事件都可以很好地捕获!:

private void registerEvents() {
    OnScroll onScroll = new OnScroll();
    root.setOnScroll(onScroll);
    OnResize onResize = new OnResize();
    root.heightProperty().addListener(onResize);
    root.widthProperty().addListener(onResize);
    OnMouseDown onMouseDown = new OnMouseDown();
    root.setOnMousePressed(onMouseDown);
    root.setOnMouseReleased((event) -> fitImage());
    root.setOnDragOver((event) -> dragOver(event));
    root.setOnDragDropped((event) -> dropFile(event));
    root.setOnKeyPressed((event) -> {
        LOG.debug("Key captured.");
        if(event.getCode() == KeyCode.PAGE_UP){
            imageView.setImage(ip.prev());
            event.consume();
        } else if(event.getCode() == KeyCode.PAGE_DOWN){
            imageView.setImage(ip.next());
            event.consume();
        }
        if(event.isConsumed()){
            fitImage();
        }
    });

我看不到登录的排名,也没有捕获一个断点.那么如何正确捕捉和处理关键事件?

推荐答案

与此同时,我找到了解决方案,感谢这个答案.诀窍是在ImageView(Stack Pane的孩子)上进行setFocusTraversable(true).这是工作代码:

@Inject
private MainLayout(ImageProvider ip) {
    this.ip = ip;

    imageView = new ImageView();
    imageView.setFocusTraversable(true);
    imageView.requestFocus();

    root = new StackPane();

    root.getChildren().add(imageView);
    registerEvents();
}

其他推荐答案

我不知道这个答案是否会让您满意,但是我会将处理事件从本班级移至您初始化场景的班级,并将事件附加到场景本身(因为StackPane是,在某种程度上,场景).我猜想,由于代码中的构造函数是私人的,因此您正在通过其他类中的公共静态方法实例化该类.

public class MainClass extends Application {
   private Scene scene = new Scene(MainLayout.getMainLayout());

   @Override
   public void start(Stage primaryStage) throws Exception {
        registerEvents();        
        primaryStage.setScene(scene);
        primaryStage.show();
    }

   private void registerEvents() {
        OnScroll onScroll = new OnScroll();
        scene.setOnScroll(onScroll);
        OnResize onResize = new OnResize();
        scene.heightProperty().addListener(onResize);
        scene.widthProperty().addListener(onResize);
        OnMouseDown onMouseDown = new OnMouseDown();
        scene.setOnMousePressed(onMouseDown);
        scene.setOnMouseReleased((event) -> fitImage());
        scene.setOnDragOver((event) -> dragOver(event));
        scene.setOnDragDropped((event) -> dropFile(event));
        scene.setOnKeyPressed((event) -> {
            LOG.debug("Key captured.");
            if (event.getCode() == KeyCode.PAGE_UP) {
                imageView.setImage(ip.prev());
                event.consume();
            } else if (event.getCode() == KeyCode.PAGE_DOWN) {
                imageView.setImage(ip.next());
                event.consume();
            }
            if (event.isConsumed()) {
                fitImage();
            }
        });
    }
}

另外,如果要保留在MainLayout类中处理事件的代码,请考虑将registerEvents公开(或本地软件包,取决于您的设计)方法接受Scene作为参数.

以上所述是小编给大家介绍的没有捕捉到JavaFX的按键,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/33897.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。