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

标签 java javafx

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

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

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

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

最佳答案

plain JavaFX 无法满足您的需求。

可以看看我的回答here ,那是最接近的东西。但是您不能在整个桌面上覆盖透明 Canvas 并将鼠标事件转发到底层窗口。

让 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

关于java - 创建忽略鼠标和按键事件的 JavaFX 透明窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36586820/

相关文章:

java - 如何为 Blackjack 创建 for 循环?

java - 无法从 Tomcat 连接到 HBase

java - 将文件或文件夹从 Documentum 中的一个存储库迁移到另一个存储库

button - 自定义 JavaFX 按钮形状

java - 如何在JavaFX中将复选框绑定(bind)到变量?

java - 比较二维 boolean 数组值?

java - 使RelativeLayout可滚动

java - 如何使用按键事件

java - Calendar.getInstance 线程安全

java - 在JavaFx Web View 中打开网页时出错