当前位置: 首页 > 知识库问答 >
问题:

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

乐刚毅
2023-03-14

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

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

所以唯一阻止我的是这样一个事实,尽管窗口是透明的,但它仍然会捕获用户的鼠标和按键事件。

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

共有2个答案

田文景
2023-03-14

你可以看看机器人课。我已经滥用了它的权力很多次,虽然我认为大多数解决方案我用那个类作为HACKY。

也许你可以这样做:

  1. 截取鼠标事件并保存其属性
  2. 像画画一样做你的事
  3. 让窗户隐形
  4. 在机器人的帮助下调用相同的鼠标事件
  5. 使Windows再次可见
汤修贤
2023-03-14

在普通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

截图:

 类似资料:
  • JavaFx ImageView不会触发鼠标事件,例如,如果您单击或拖动透明像素,则按或拖动鼠标事件,是否有办法解决此问题并从透明区域检测鼠标事件? 使用ImageView命名视图,我想用鼠标拖动事件移动它,所以我写了这段代码 到目前为止,这段代码运行良好,但如果您在他耳朵下面(或任何透明的地方)按下或拖动某个位置,将不会发生任何事情!如何解决这个问题!

  • 我想要一个舞台,是相同的大小,屏幕是完全透明的,接收鼠标事件在任何地方。在下面的示例中,我只在鼠标位于圆圈上方时才获得鼠标事件。我在使用Java 8U11的Windows XP和Windows 7上都看到了这个问题 有趣的是,如果我将填充颜色的alpha部分设置为它的绝对最小值,那么我会得到鼠标事件。然而,我不想使用这个变通方法,而是要真正深入到问题的底部。我的结论是,在JavaFX或Window

  • 我有以下代码来显示(自定义by-mvn repo) 问题是, > 我希望在鼠标输入时显示弹出窗口-工作正常。 我希望在用户从标签退出鼠标时隐藏弹出窗口,但在弹出窗口中输入鼠标时不隐藏弹出窗口。 我已经在标签上添加了鼠标插入和鼠标退出操作,但如何处理另一种情况,即如果用户输入鼠标进入弹出窗口,我不想隐藏弹出窗口。

  • 我有两层(=锚烷),一层叠在另一层上,有一个堆叠窗格。所以这两层都填满了整个场景。问题是,只有顶层接收鼠标事件。 这就是场景的构建方式: 只有按钮B接收点击事件,但按钮A不接收。 如果我将层B设置为鼠标透明(),按钮A将接收鼠标事件。但是鼠标的透明效果也会影响所有的孩子,所以按钮B不再接收鼠标事件。 如何让按钮A和按钮B接收鼠标事件? 以下是完整的工作来源:

  • 所以我有这个anchorpane,我希望为第二个鼠标键添加一个鼠标listner。我尝试了以下方法,但我一直得到一个错误,有人知道问题是什么吗? 为了记录在案,我也尝试过这样做: 绑定不匹配:MouseButton类型不能有效替代EventHandler类型的有界参数

  • 我需要对按键-鼠标事件组合做出反应,如: CtrlShiftR 但是我不知道,只有在按住Ctrl键和Shift键的组合出现时,如何处理“左键单击”的问题。 像这样的解决方案 不会工作,因为可能有不同的组合键和任何种类的字母。 有什么想法吗?