创建忽略鼠标和按键事件的JavaFX透明窗口

创建忽略鼠标和按键事件的JavaFX透明窗口,java,javafx,Java,Javafx,我想制作一个JavaFX应用程序,它基本上用Canvas对象覆盖整个用户屏幕,因此基本上我可以在用户屏幕上绘制任何东西 制作一个覆盖整个屏幕的窗口很简单。通过本教程可以实现基本透明: 因此,唯一让我无法理解的是,尽管窗口是透明的,但它仍然会捕获用户鼠标和按键事件 有什么办法可以做到这一点吗?举一个更具体的例子,假设我想在用户鼠标光标所到之处画一个红色圆圈,但用户输入不会被中断。在普通JavaFX中,您想要的是不可能的 你可以看看我的答案,这是最接近的。但您不能在整个桌面上覆盖透明画布,并将鼠标事

我想制作一个JavaFX应用程序,它基本上用
Canvas
对象覆盖整个用户屏幕,因此基本上我可以在用户屏幕上绘制任何东西

制作一个覆盖整个屏幕的窗口很简单。通过本教程可以实现基本透明:

因此,唯一让我无法理解的是,尽管窗口是透明的,但它仍然会捕获用户鼠标和按键事件


有什么办法可以做到这一点吗?举一个更具体的例子,假设我想在用户鼠标光标所到之处画一个红色圆圈,但用户输入不会被中断。

在普通JavaFX中,您想要的是不可能的

你可以看看我的答案,这是最接近的。但您不能在整个桌面上覆盖透明画布,并将鼠标事件转发到底层窗口

使画布半透明将捕获所有事件,但您可以看到底层窗口。但是当画布完全透明时,应用程序将无法捕获任何事件

然而,你的“具体例子”可以用另一种方式解决。代码如下:

import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class CircleAroundCursor extends Application {

    double radius = 50;

    @Override
    public void start(Stage primaryStage) {

        Group root = new Group();

        Circle circle = new Circle( radius * 2,radius * 2,radius);
        circle.setStroke(Color.RED);
        circle.setFill(Color.TRANSPARENT);

        root.getChildren().add(circle);

        Scene scene = new Scene(root, Color.TRANSPARENT);

        scene.getRoot().setStyle("-fx-background-color: transparent");

        primaryStage.initStyle(StageStyle.TRANSPARENT);
        primaryStage.setScene(scene);
        primaryStage.show();
        primaryStage.setAlwaysOnTop(true);


        AnimationTimer loop = new AnimationTimer() {

            @Override
            public void handle(long now) {

                PointerInfo info = MouseInfo.getPointerInfo();
                Point p = info.getLocation();

                primaryStage.setX(p.getX() - radius * 2);
                primaryStage.setY(p.getY() - radius * 2);

            }
        };
        loop.start();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
这至少解决了“我想在用户鼠标光标所到之处画一个红色圆圈,但用户输入不会被中断”

注意:这里AWT类与FX类混合使用。您可能需要使用EDT&FX线程处理。不过,它确实可以工作

截图:


你可以看看这门课。我多次滥用它的权力,尽管我认为我使用的大多数解决方案作为HACKY。

也许你可以这样做:

  • 拦截MouseEvent并保存其属性
  • 你喜欢画画吗
  • 让窗户看不见
  • 在的帮助下调用相同的MouseEvent
  • 使窗口再次可见

  • 我正在运行您的红色圆圈示例,用户的鼠标输入确实被中断。基本上,点击任何地方(比如选择文本)都不起作用。我使用的是Mac OSX,唯一没有中断鼠标点击的部分是在dock中,这是有意义的,因为应用程序无法覆盖dock。它在Windows 10上工作。但正如我所说的,在普通的JavaFX中不可能实现您想要的。您需要使用一些特定于操作系统的编码。您是否已经尝试使用
    setMouseTransparent(true)
    setPickOnBounds(false)
    ?@jns嗯,我在
    root
    circle
    上都试过了,但似乎没有任何变化。我想我不会介意非JavaFX解决方案,只要它仍然是Java。