JavaFX 按键未捕获

der*_*itz 5 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();

}
Run Code Online (Sandbox Code Playgroud)

关于焦点的两条线都没有效果。堆栈窗格直接添加到场景中。除了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();
        }
    });
Run Code Online (Sandbox Code Playgroud)

我没有看到注销,也没有捕获断点。那么如何正确捕获并处理关键事件呢?

tta*_*ski 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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想在类中保留用于处理事件的代码MainLayout,请考虑使registerEvents公共(或本地包,取决于您的设计)方法接受Scene作为参数。