我想要一个与屏幕大小相同的舞台,它完全透明并可以在任何地方接收鼠标事件。在下面的示例中,仅当鼠标位于圆圈上方时我才会收到鼠标事件。我在使用 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
Research
-
JavaFx 透明窗口 - 是的,请。鼠标透明 - 不用了,谢谢 https://stackoverflow.com/questions/23642238/javafx-transparent-window-yes-please-mouse-transparent-no-thanks描述了类似的问题,但它没有解决完全透明区域中鼠标事件的问题
- 调试 - 在 setOnMouseMoved() 中使用断点 我已经检查了前面的堆栈帧以尝试找到命中检测代码。
- 使用JNA测试不同的样式,例如WS_EX_TRANSPARENT和WS_EX_LAYERED。有趣的是,WS_EX_TRANSPARENT 使窗口对鼠标完全透明 - 绘制的像素上没有鼠标事件。
- 尝试将鼠标侦听器放在矩形/StackPane 上 - 没有区别
- MSDN 文章分层窗口 http://msdn.microsoft.com/en-us/library/ms997507.aspx暗示此功能是 Windows 而不是 JavaFX 的一部分。如果这是真的,有什么解决方法吗?
分层窗口的命中测试基于形状和透明度
窗户的。这意味着窗口的区域
颜色键控或 alpha 值为零将让鼠标消息
通过。如果分层窗口具有 WS_EX_TRANSPARENT 扩展
窗口样式,分层窗口的形状将被忽略,并且
鼠标事件将被传递到下面的其他窗口
分层窗口。
总之,唯一已知的解决方案是将背景设置为“不太”透明,以欺骗 JavaFX 发送事件。
rectangle.setFill(Color.rgb(0, 0, 0, 1d / 255d)); // receives mouse events
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)