【发布时间】:2014-07-01 18:37:02
【问题描述】:
我想创建一个简单的 JavaFx 类,向用户显示一个覆盖用户屏幕的半透明矩形(比如任意 50% 的透明度)。它应该只是让我获得鼠标点击事件的点。这听起来微不足道,但是当我创建透明窗口时,它们似乎对鼠标事件总是透明的,而不仅仅是我对半透明可见性的要求。鼠标事件永远不会被触发。
我在矩形和根窗格上使用了 setMouseTransparent(false),但这没有区别。如果有人能指出任何错误/误解,我将不胜感激。
这是我创建的简单测试类:
public class ClickScreen implements MouseListener {
private ClickScreenListener listener;
private Stage window;
private Point point;
public ClickScreen(ClickScreenListener listener) {
// Get screen size
Rectangle2D r = Screen.getPrimary().getBounds();
// Something to put stuff in
StackPane root = new StackPane();
// Translucent rectangle on the pane
Rectangle rectangle = new Rectangle(r.getWidth(), r.getHeight());
rectangle.setFill(Color.rgb(183, 183, 183, 0.5));
root.getChildren().add(rectangle);
Scene scene = new Scene(root, r.getWidth(), r.getHeight());
scene.setFill(null);
window = new Stage();
window.initStyle(StageStyle.TRANSPARENT);
window.setTitle("Click drop location");
window.setScene(scene);
this.listener = listener;
}
public Point getLocation(){
return point;
}
@Override
public void mouseClicked(MouseEvent e) {
point = e.getLocationOnScreen();
listener.screenClicked(point);
}
}
编辑: 我遇到的透明度问题的一个更简单的例子来自这个 Hello World!例子。当我将鼠标悬停在按钮上时,大约有 50:50 的机会单击按钮或单击“通过”并将焦点放在底层窗口(在我的情况下通常是 eclipse)。希望您对此有想法。
public class HelloWorld extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
scene.setFill(null);
primaryStage.setScene(scene);
primaryStage.initStyle(StageStyle.TRANSPARENT);
primaryStage.show();
}
}
【问题讨论】:
-
你没有将你的听众附加到任何东西上,比如scene.setOnMouseClicked(listener)。更多详情请关注Handling JavaFX Events
标签: java javafx-2 mouseevent transparency