Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX画布未拾取关键事件_Java_Events_Canvas_Javafx_Key - Fatal编程技术网

JavaFX画布未拾取关键事件

JavaFX画布未拾取关键事件,java,events,canvas,javafx,key,Java,Events,Canvas,Javafx,Key,下面的代码显示了一个JavaFX画布,其中包含3个连续的hello世界 StackPane root = new StackPane(); Canvas canvas = new Canvas(250,250); canvas.setOnMouseEntered((a) -> System.out.println("hi")); canvas.setOnMousePressed((a) -> System.out.printl

下面的代码显示了一个JavaFX画布,其中包含3个连续的hello世界

    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();
StackPane root=new StackPane();
画布=新画布(250250);
canvas.setonmouseintered((a)->System.out.println(“hi”);
canvas.setOnMousePressed((a)->System.out.println(“焦点”);
canvas.setOnKeyReleased(新的EventHandler(){
@凌驾
公共无效句柄(KeyEvent事件){
系统输出打印项次(“已处理”);
}
});
//canvas.setOnKeyPressed((a)->System.out.println(“hi”);
GraphicsContext上下文=canvas.getGraphicsContext2D();
context.setFill(Color.BLUE);
最终int fontSize=15,fontSpace=5;
context.setFont(Font.Font(15));
上下文.fillText(“hello world”,75,75);
填充文本(“hello world”,75,75+fontSize+fontSpace);
context.fillText(“hello world”,75,75+(fontSize+fontSpace)*2);
root.getChildren().add(画布);
场景=新场景(根,300,250);
setTitle(“你好,世界!”);
初级阶段。场景(场景);
primaryStage.show();
当我将鼠标移到它上面时,它会打印“嗨”。当我点击它时,它会打印“焦点”。当我按键时,什么也没发生。我有什么遗漏吗?

你需要

canvas.setFocusTraversable(true);

默认情况下,没有设置为画布。

添加以下行:

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

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

我不确定是否会在任何鼠标事件上执行此操作,因为移动器悬停会使其获得焦点,如果您在附近有一个文本字段,并且您希望悬停在画布上的某个元素上以获得进入该字段的信息,则焦点会被获取,这可能会导致混淆迷路的我可能会过滤到鼠标按下之类的东西,这样用户只有在特别请求时才可以通过单击来取消控制。然而,对于修复的基本思想,答案是好的。。。这是关键。