向JavaFX应用程序添加透明覆盖

时间:2018-06-26 01:51:44

标签: java canvas javafx

我正在尝试向JavaFX应用程序添加具有透明背景的覆盖层,该覆盖层不应更改鼠标的工作方式或其他任何用途,而只是出于装饰目的。

我有这样的东西:

<StackPane>
    <VBox ... /> (The content)
    <Canvas /> (The overlay)
</StackPane>

但是这里的问题是我不能单击VBox,因为Canvas在它的前面,所以我试图使鼠标对Canvas canvas.setMouseTransparent(true)透明,但是当我这样做时,一切正常但是所有鼠标事件都不再触发,因为其中的任何元素:画布,VBox,StackPane,场景...

我也尝试在StackPane的画布上使用setPickOnBounds(false),但是它也不起作用(我无法单击VBox节点)。

我觉得这是JavaFX错误,但是我不确定,我希望得到您的意见。

编辑
在进行进一步测试时,我发现仅当将鼠标悬停在内容层上的某个项目时才调用Mouse Moved Event。

以下是重现此问题的示例代码:

public class TestApp extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        StackPane root = new StackPane();

        root.addEventHandler(MouseEvent.MOUSE_MOVED,
                event -> System.out.println(event.getX() + " / " + event.getY()));

        VBox content = new VBox();
        content.setBackground(new Background(new BackgroundFill(Color.CORNSILK, CornerRadii.EMPTY, Insets.EMPTY)));
        content.setFillWidth(true);

        Button test = new Button("This is a test button");
        test.setPrefWidth(500);
        test.setPrefHeight(100);

        content.getChildren().add(test);

        Canvas overlay = new Canvas();
        overlay.setWidth(1280);
        overlay.setHeight(720);
        overlay.setMouseTransparent(true);

        GraphicsContext context = overlay.getGraphicsContext2D();
        context.setFill(Color.color(1, 0.5, 0.5, 0.8));
        context.fillRect(0, 0, 1280, 720);

        root.getChildren().addAll(content, overlay);

        primaryStage.setScene(new Scene(root, 1280, 720));
        primaryStage.show();
    }
}

使用此代码,当我将鼠标悬停在按钮上时,我可以在控制台中看到不再调用MouseEvent,但是当我不悬停时,将调用MouseEvent。

0 个答案:

没有答案