我正在尝试向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。