Los eventos del mouse y los eventos de desplazamiento se comportan de diferentes maneras
Eventos del mouse:
El evento es capturado por mainStage
El evento es capturado por mainStage
El evento no se captura
Eventos de desplazamiento:
El evento es capturado por mainStage
El evento es capturado por secondStage
El evento no se captura
¿Hay alguna forma de que secondStage transparente no capture eventos de desplazamiento?
Mi código:
Pane mainPane = new Pane(new Label("Main Stage"));
mainPane.setPrefSize(300, 300);
mainStage.setScene(new Scene(mainPane));
Stage secondStage = new Stage();
Pane secondPane = new Pane(new Label("Second Stage"));
secondPane.setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)));
secondPane.setBorder(new Border(
new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(2))));
secondPane.setPrefSize(300, 300);
secondStage.setScene(new Scene(secondPane, Color.TRANSPARENT));
secondStage.initStyle(StageStyle.TRANSPARENT);
mainStage.getScene().setOnScroll(event -> System.out.println("Scroll in main stage"));
secondStage.getScene().setOnScroll(event -> System.out.println("Scroll in second stage"));
mainStage.getScene().setOnMouseClicked(event -> System.out.println("Click in main stage"));
secondStage.getScene().setOnMouseClicked(event -> System.out.println("Click in second stage"));
mainStage.show();
secondStage.show();
Versión de Java: 1.8.0_201 (64 bits), Windows 10
editar: El ejemplo es una simplificación con solo dos ventanas. Activar el evento mediante programación implica descubrir qué etapa es inmediatamente inferior y ese es otro problema en sí mismo.
setMouseTransparent
? Sin embargo, no estoy completamente seguro de cómo funcionaría con ventanas transparentes.Respuestas:
Puede ser una gran coincidencia, que también vinimos con la misma solución de ventana transparente debido a que no tenemos la función de administrar el índice z de etapas. Y encontramos exactamente el mismo problema que el tuyo. es decir, los eventos de desplazamiento no se propagan a las Etapas subyacentes. Utilizamos el siguiente enfoque, sin saber si esto puede ayudarlo:
En primer lugar, construimos una clase Singleton que mantiene una referencia de nodo en la que se encuentra actualmente.
Luego, cuando creamos cualquier etapa normal, incluimos los siguientes controladores a la escena de esa nueva etapa. La clave aquí es que, los eventos del mouse todavía pueden pasar a través de la etapa transparente a la ventana subyacente, realizar un seguimiento del nodo que se encuentra debajo del mouse.
En la escena de la ventana transparente, incluimos los siguientes controladores para delegar los eventos de desplazamiento al nodo subyacente.
Estoy bastante seguro de que esta no es la forma más deseada. Pero esto abordó nuestro problema. :)
A continuación se muestra el código de demostración rápida de lo que quiero decir.
fuente
No sé si es correcto o no, pero puede vincular propiedades:
fuente
Puede crear un despachador de eventos personalizado que ignore los eventos que no desea:
Luego ponlo en tu escenario:
fuente
No sé cómo funciona esto en el contexto de las etapas, pero para formas simples hace la diferencia si configuras el color de relleno
Color.TRANSPARENT
o simplementenull
. Usar cualquierColor
evento de captura, mientrasnull
que no.fuente
secondPane.getScene().setFill(null)
o senew BackgroundFill(null, CornerRadii.EMPTY, Insets.EMPTY)
comporta exactamente igual en este casoPuede hacerlo ignorando el evento en la segunda etapa usando el despachador de eventos usando esta respuesta de @Slaw, puede entender todo sobre
EventDispatcher
https://stackoverflow.com/a/51015783/5303683.
Luego puede disparar su propio evento usando esta respuesta al DVarga https://stackoverflow.com/a/40042513/5303683 Lo siento, no tengo tiempo para intentar hacer un ejemplo completo de esto
fuente