Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX透明窗口仅在绘制的像素上接收鼠标事件_Java_Javafx_Javafx 8 - Fatal编程技术网

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

JavaFX透明窗口仅在绘制的像素上接收鼠标事件,java,javafx,javafx-8,Java,Javafx,Javafx 8,我想要一个与屏幕大小相同的舞台,它是完全透明的,可以在任何地方接收鼠标事件。在下面的示例中,我仅当鼠标位于圆上方时才获取鼠标事件。我在使用Java8U11的WindowsXP和Windows7上都看到了这个问题 import javafx.application.Application; import javafx.geometry.Rectangle2D; import javafx.scene.Scene; import javafx.scene.layout.StackPane; impo

我想要一个与屏幕大小相同的舞台,它是完全透明的,可以在任何地方接收鼠标事件。在下面的示例中,我仅当鼠标位于圆上方时才获取鼠标事件。我在使用Java8U11的WindowsXP和Windows7上都看到了这个问题

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
研究

  • 描述了一个类似的问题,但是它没有解决完全透明区域中的鼠标事件问题
  • 调试-使用setOnMouseMoved()中的断点,我检查了前面的stackframes,试图找到命中检测代码
  • 使用JNA测试不同的样式,例如WS_EX_透明和WS_EX_分层。有趣的是,WS_EX_TRANSPARENT使窗口完全透明-在绘制的像素上没有鼠标事件
  • 尝试将鼠标侦听器放在矩形/堆栈窗格上-没有区别
  • MSDN文章暗示此功能是Windows而不是JavaFX的一部分。如果这是真的,有什么解决办法吗
分层窗口的命中测试基于形状和透明度 窗边。这意味着窗口中 颜色键或其alpha值为零将允许鼠标发送消息 通过如果分层窗口具有WS_EX_透明扩展 窗口样式时,分层窗口的形状将被忽略,而 鼠标事件将被传递到 分层窗口


总之,唯一已知的解决方案是将背景设置为“不完全”透明,以欺骗JavaFX发送事件

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

作为比较:在MacOS X 10.9.5上,矩形也在透明区域接收鼠标事件。因此,这似乎更像是一个Windows特有的问题,而不是JacaFX。在Windows7上,矩形也在传输区域接收鼠标事件。你的jdk版本是什么?8u11。我已经更新了这个问题。您使用的是什么版本?我使用的是8u20,但我已经下载了jdk 8u11并对其进行了测试。。。矩形也在传输区域接收到鼠标事件。我正在使用适用于Windows的jre7.67和适用于Linux的jre7.71,但我不接收事件。有消息吗?这是已知的错误吗?