【问题标题】:JavaFX Canvas not picking up key eventsJavaFX Canvas 没有接收到关键事件
【发布时间】:2014-06-09 18:47:47
【问题描述】:

我有以下代码显示一个带有 3 个连续 hello worlds 的 JavaFX Canvas

    StackPane root = new StackPane();

        Canvas canvas = new Canvas(250,250);
        canvas.setOnMouseEntered((a) -> System.out.println("hi"));
        canvas.setOnMousePressed((a) -> System.out.println("focus"));
        canvas.setOnKeyReleased(new EventHandler<KeyEvent>() {

            @Override
            public void handle(KeyEvent event) {
                System.out.println("Handled");
            }
        });
//        canvas.setOnKeyPressed((a) -> System.out.println("hi"));

        GraphicsContext context = canvas.getGraphicsContext2D();
        context.setFill(Color.BLUE);
        final int fontSize = 15, fontSpace = 5;
        context.setFont(Font.font(15));

        context.fillText("hello world", 75, 75);
        context.fillText("hello world", 75, 75 + fontSize + fontSpace);
        context.fillText("hello world", 75, 75 + (fontSize + fontSpace) * 2);

        root.getChildren().add(canvas);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();

当我将鼠标悬停在它上面时,它会打印“hi”。当我单击它时,它会打印“焦点”。当我按键时,什么也没有发生。我有什么遗漏吗?

【问题讨论】:

    标签: java events canvas javafx key


    【解决方案1】:

    你需要

    canvas.setFocusTraversable(true);
    

    因为画布默认没有设置focusTraversable

    【讨论】:

    • grrrrr...这是关键。
    【解决方案2】:

    添加以下行:

    canvas.addEventFilter(MouseEvent.ANY, (e) -> canvas.requestFocus());
    

    单击画布后,画布将请求焦点并识别关键事件。

    【讨论】:

    • 我不确定我是否会在任何鼠标事件上执行此操作,因为让您的移动器悬停会使其获得焦点,如果您附近有一个文本字段并且您想将鼠标悬停在某个元素上,这可能会导致混乱在画布上获取输入该字段的信息,然后焦点丢失。我可能会过滤到 MOUSE_PRESSED 之类的东西,这样用户只有在他们通过点击特别请求时才会取消控制权。然而,对于修复的原则,答案很好。
    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多