Добавить прозрачное наложение в приложение JavaFX - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь добавить наложение с прозрачным фоном в свое приложение JavaFX, это наложение не должно изменять работу мыши или чего-либо еще, это просто для косметических целей.

У меня есть что-то вроде этого:

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

Но проблема в том, что я не могу щелкнуть VBox, потому что Canvas находится перед ним, поэтому я попытался сделать мышь прозрачной для Canvas canvas.setMouseTransparent(true), но когда ясделайте это, все работает, но все события мыши больше не запускаются ни для одного из элементов: холста, VBox, StackPane, Scene ...

Я также пытался использовать setPickOnBounds(false) нахолст на StackPane, но он тоже не работает (я не могу щелкнуть узел VBox).

Мне кажется, что это ошибка JavaFX, но я не уверен, мне бы хотелосьчтобы узнать ваше мнение.

РЕДАКТИРОВАТЬ
Во время некоторых дальнейших проверок я обнаружил, что событие перемещения мыши вызывается не только при наведении курсора на элемент со слоя содержимого.

Вот пример кода тo воспроизвести проблему:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...