我喜欢与屏幕尺寸相同的舞台,它完全透明并可在任何地方接收鼠标事件。在下面的示例中,仅当鼠标位于圆圈上时才会获得鼠标事件。我在使用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
研究
分层窗口的命中测试基于形状和透明度 的窗口。这意味着窗口的区域是 颜色键或其alpha值为零将让鼠标消息 通过。如果分层窗口扩展了WS_EX_TRANSPARENT 窗口样式,分层窗口的形状将被忽略 鼠标事件将被传递到下面的其他窗口 分层窗口。
答案 0 :(得分:1)
总之,只有已知的解决方案是将背景设置为“不完全”透明,以便将JavaFX欺骗为发送事件。
rectangle.setFill(Color.rgb(0, 0, 0, 1d / 255d)); // receives mouse events