Я пытаюсь добавить наложение с прозрачным фоном в свое приложение 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.