javafx - 如何将 ScrollPane 事件 KEY_PRESSED、KeyCode.LEFT 传递给父 Pane ?

标签 javafx javafx-2

我有一个 StackPane,其中只有一个子元素 - ScrollPane。我正在尝试处理 StackPane 上的 KEY_PRESSED、KeyCode.LEFT (只是一个示例,我想处理每个箭头键)事件。 正如我所关心的,特定事件是在 ScrollPane 上消耗的。我想防止这种情况发生,但找不到任何合理的方法。

最佳答案

import javafx.application.Application;
import javafx.event.Event;
import javafx.event.EventDispatcher;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class ScrollPaneDispatcherApp extends Application {

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

    @Override
    public void start(Stage stage) throws Exception {

        StackPane stackPane = new StackPane();
        stackPane.setStyle("-fx-backgound-color: red");

        ScrollPane scrollPane = new ScrollPane();
        scrollPane.setStyle("-fx-background-color: yellow");

        stackPane.getChildren().add(scrollPane);

        Scene scene = new Scene(stackPane);
        stage.setScene(scene);
        stage.show();

        scrollPane.requestFocus();

        EventDispatcher sceneEventDispatcher = scene.getEventDispatcher();
        EventDispatcher stackPaneEventDispatcher = stackPane.getEventDispatcher();
        EventDispatcher scrollPaneEventDispatcher = scrollPane.getEventDispatcher();

        scene.setEventDispatcher((event, tail) -> {
            if (KeyEvent.ANY.equals(event.getEventType().getSuperType())) {
                System.out.println("DISPATCH\tScene\t\tevent=" + event.getEventType());
            }
            return sceneEventDispatcher.dispatchEvent(event, tail);
        });

        stackPane.setEventDispatcher((event, tail) -> {
            if (KeyEvent.ANY.equals(event.getEventType().getSuperType())) {
                System.out.println("DISPATCH\tStackPane\tevent=" + event.getEventType());
            }
            return stackPaneEventDispatcher.dispatchEvent(event, tail);
        });

        scrollPane.setEventDispatcher((event, tail) -> {
            if (KeyEvent.ANY.equals(event.getEventType().getSuperType())) {
                System.out.println("DISPATCH\tScrollPane\tevent=" + event.getEventType());
            }
            Event eventToDispatch = scrollPaneEventDispatcher.dispatchEvent(event, tail);
            if (KeyEvent.KEY_PRESSED.equals(event.getEventType())) {
                if (KeyCode.LEFT.equals(((KeyEvent) event).getCode()) || KeyCode.RIGHT.equals(((KeyEvent) event).getCode())) {
                    if (eventToDispatch == null) {
                        return event;
                    }
                }
            }
            return eventToDispatch;
        });

        scene.addEventFilter(KeyEvent.ANY,
                event -> System.out.println("FILTER\t\tScene\t\tevent=" + event.getEventType()));
        stackPane.addEventFilter(KeyEvent.ANY,
                event -> System.out.println("FILTER\t\tStackPane\tevent=" + event.getEventType()));
        scrollPane.addEventFilter(KeyEvent.ANY,
                event -> System.out.println("FILTER\t\tScrollPane\tevent=" + event.getEventType()));

        scene.addEventHandler(KeyEvent.ANY,
                event -> System.out.println("HANDLER\t\tScene\t\tevent=" + event.getEventType()));
        stackPane.addEventHandler(KeyEvent.ANY,
                event -> System.out.println("HANDLER\t\tStackPane\tevent=" + event.getEventType()));
        scrollPane.addEventHandler(KeyEvent.ANY,
                event -> System.out.println("HANDLER\t\tScrollPane\tevent=" + event.getEventType()));
    }
}

建议的解决方案会覆盖 ScrollPane 的左、右箭头 KEY_PRESSED 事件消耗行为。线索是 ScrollPane 的新 EventDispatcher。其余代码仅用于调试目的。

关于javafx - 如何将 ScrollPane 事件 KEY_PRESSED、KeyCode.LEFT 传递给父 Pane ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48720101/

相关文章:

java - 在 JavaFX 中的图像上使用 ColorPicker

java - 类不能重用是什么意思? (具体来说,Java FX 2 任务)

javafx 8 兼容性问题 - FXML 静态字段或方法

text - JavaFx 2.x : How to write text on a chart?

javafx-2 - JavaFX 2.x : Translate mouse click coordinate into XYChart axis value

java - JavaFX 中带有单元工厂的动态加载表单 : Memory Leaks Waiting to Happen?

java - JavaFX TableView 宽度从何而来?

JavaFX - FXML 文件中的自定义对象

java - 没有 SQL 的 Javafx 数据库

Javafx Stage 可见性属性