Ventana transparente JavaFx: sí, por favor. Ratón transparente: no, gracias
Me gustaría crear una clase JavaFx simple que muestre al usuario un rectángulo translúcido (digamos una transparencia arbitraria del 50%) que cubra la pantalla del usuario. Simplemente debería permitirme obtener el evento Point of a mouse click. Esto suena trivial, pero cuando creo ventanas transparentes siempre parecen ser transparentes a los eventos del mouse en lugar de solo mi requisito de visibilidad semitransparente. El evento del mouse nunca se activa.
He usado setMouseTransparent (false) en el rectángulo y el panel raíz, pero esto no hace ninguna diferencia. Estaría realmente agradecido si alguien pudiera indicar algún error / concepto erróneo.
Aquí está la clase de prueba trivial que he creado:
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);
}
}
Editar: ¡Un ejemplo más simple del problema de transparencia que estoy experimentando es este Hello World! ejemplo. Cuando paso el mouse sobre el botón, es aproximadamente 50:50 la posibilidad de hacer clic en el botón o simplemente hacer clic en "a través" y enfocar la ventana subyacente (que generalmente es un eclipse en mi caso). Me encantaría tus pensamientos sobre esto.
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();
}
}