未捕获JavaFX键按下

时间:2015-07-09 14:09:58

标签: java events javafx keyevent

我正在尝试捕获按键事件(向上翻页和向下翻页),但根本没有收到任何关键事件。这是相关代码: 构造:

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

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

}

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

这是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();
        }
    });

我没有看到退出登记,也没有抓住断点。那么如何正确捕捉和处理关键事件呢?

2 个答案:

答案 0 :(得分:1)

与此同时,由于this answer,我找到了解决方案。诀窍是ImageView(堆栈窗格的子窗口)上的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();
}

答案 1 :(得分:0)

我不知道这个答案是否会让你满意,但是我会将这个类的处理事件移动到初始化场景的类中,并将事件附加到场景本身(自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作为一个参数。