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

时间:2016-04-13 01:12:11

标签: java javafx

我想创建一个基本上覆盖整个用户屏幕的JavaFX应用程序Canvas对象,所以基本上我可以在用户的​​屏幕上绘制任何内容。

制作一个覆盖整个屏幕的窗口很简单。使用本教程可以实现基本透明:https://assylias.wordpress.com/2013/12/08/383/

所以阻止我的唯一一件事就是显而易见的是,窗口虽然是透明的,但它仍会捕获用户鼠标和键事件。

有没有办法实现这个目标?对于一个更具体的例子,想象一下我想在用户的鼠标光标周围做一个红色圆圈,但用户输入不会被中断。

2 个答案:

答案 0 :(得分:4)

plain JavaFX中无法实现所需。

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

使Canvas半透明会捕获所有事件,但您可以看到底层窗口。但是当你使Canvas完全透明时,你的应用程序就不会捕获任何事件。

但是,你的“具体例子”可以用不同的方式解决。这是代码:

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线程处理。它确实没有。

截图:

enter image description here

答案 1 :(得分:2)

您可以查看Robot课程。我曾经多次滥用它的权力,虽然我认为大多数解决方案我都把这个类用作hacky。

也许你可以这样做:

  1. 拦截MouseEvent并保存其属性
  2. 做你喜欢的事情
  3. 使窗口不可见
  4. Robot
  5. 的帮助下调用相同的MouseEvent
  6. 让Windows再次可见