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

JavaFX透明窗口只接收绘制像素上的鼠标事件

端木桐
2023-03-14

我想要一个舞台,是相同的大小,屏幕是完全透明的,接收鼠标事件在任何地方。在下面的示例中,我只在鼠标位于圆圈上方时才获得鼠标事件。我在使用Java 8U11的Windows XP和Windows 7上都看到了这个问题

import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class TransparentTest extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage ignored) throws Exception {
        Stage stage = new Stage(StageStyle.TRANSPARENT);
        stage.setTitle("Transparent app test");

        Rectangle2D screenBounds = Screen.getPrimary().getBounds();
        stage.setX(0);
        stage.setY(0);
        stage.setWidth(screenBounds.getWidth());
        stage.setHeight(screenBounds.getHeight());

        Circle circle = new Circle(100);
        circle.setFill(Color.RED);
        Rectangle rectangle = new Rectangle(screenBounds.getWidth(),
                screenBounds.getHeight());
        rectangle.setFill(Color.TRANSPARENT);
        Scene scene = new Scene(new StackPane(circle, rectangle));
        scene.setFill(null);
        stage.setScene(scene);

        scene.setOnMouseMoved((e) -> {
            System.out.println("Mouse over rectangle " + e);
        });
        stage.show();
    }
}

有趣的是,如果我将填充颜色的alpha部分设置为它的绝对最小值,那么我会得到鼠标事件。然而,我不想使用这个变通方法,而是要真正深入到问题的底部。我的结论是,在JavaFX或Windows库中,有一些命中检测代码可以根据鼠标事件的像素值过滤鼠标事件。

 rectangle.setFill(Color.rgb(0, 0, 0, 1d / 255d)); // receives mouse events        
 rectangle.setFill(Color.rgb(0, 0, 0, 0));         // does not receive mouse events

研究

  • JavaFX透明窗口-是。鼠标透明-no thanks描述了一个类似的问题,但是它没有解决完全透明区域中的鼠标事件问题
  • 调试-使用setOnMouseMoved()中的断点,我检查了前面的堆栈帧,试图找到命中检测代码
  • 使用JNA测试不同的样式,如WS_EX_TRANSPARENT和WS_EX_Layered。有趣的是,WS_EX_TRANSPARENT使窗口完全鼠标透明--在绘制的像素上没有鼠标事件。
  • 尝试将鼠标侦听器放在矩形/StackPane上-没有区别
  • MSDN文章Layered Windows暗示该功能是Windows的一部分,而不是JavaFX的一部分。如果这是真的,有没有解决办法?

分层窗口的命中测试基于窗口的形状和透明度。这意味着窗口中有颜色键控或alpha值为零的区域将允许鼠标消息通过。如果分层窗口具有WS_EX_TRANSPARENT扩展窗口样式,则将忽略分层窗口的形状,并将鼠标事件传递给分层窗口下方的其他窗口。

共有1个答案

江宏放
2023-03-14

总之,唯一已知的解决方案是将后台设置为“不太”透明,以骗过JavaFX发送事件。

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

  • 我想制作一个JavaFX应用程序,它基本上用对象覆盖整个用户屏幕,因此基本上我可以在用户屏幕上绘制任何东西。 制作一个覆盖整个屏幕的窗口很简单。使其本质上透明可以通过本教程实现:https://assylias.wordpress.com/2013/12/08/383/ 所以唯一阻止我的是这样一个事实,尽管窗口是透明的,但它仍然会捕获用户的鼠标和按键事件。 有什么办法可以做到这一点吗?举一个更具体

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

  • 我目前有以下的类: 老实说,代码并不重要,请相信我,当用户将鼠标悬停在我的< code>Item对象上时,它会显示一个弹出窗口,如下所示: 这个弹出窗口在我的屏幕中间打开。如果我移动窗口,弹出窗口将在同一位置打开。我需要我的弹出窗口以某种方式在鼠标指针下打开。我知道具有此功能(据称),但我已经致力于设计这个,它具有我的许多设计目标。 这有可能让显示在某个位置吗? 谢谢。

  • 我要在两个图像视图之间绘制路径,视图与图片相同 此路径从其中一个imageview开始(按鼠标),继续(按鼠标)并在窗格上移动事件,并且必须在另一个imageview结束(按鼠标)。这是第一次鼠标按下在imageviews上没有收到任何鼠标按下事件后的问题,该事件只是在窗格上收到,因为绘制线没有停止。我的代码出了什么问题? 这是我的控制器代码: 请帮帮我。

  • 我在画布上处理鼠标事件时遇到问题。我想用鼠标来绘制它,我已经想出了这些事件处理程序,但当我开始绘制时,它们什么都不做。 你能帮我告诉我遗漏了什么或者如何重写它以便它开始工作吗?