In fx, mouseEvents non viene inviato ai nodi disabilitati, alla fine è un rapido esempio che dimostra il comportamento.Come consentire a MouseEvents di essere inviato ai nodi disabilitati?
Per uno Swinger come me, è un po 'sorprendente: nella mia terra, gli eventi vengono consegnati ed è compito del destinatario (ui-delegato) decidere se l'evento debba essere gestito o meno. In realtà è stato sottolineato a questo da una recente - perfettamente valido, IMO - use-case of showing a tooltip over a disabled component
Tecnicamente, l'invio sembra di essere tagliati fuori in uno dei metodi impl del nodo:
/**
* Finds a top-most child node that intersects the given ray.
*
* The result argument is used for storing the picking result.
*/
@Deprecated
public final void impl_pickNode(PickRay pickRay, PickResultChooser result) {
// In some conditions we can omit picking this node or subgraph
if (!isVisible() || isDisable() || isMouseTransparent()) {
return;
}
che sembra essere chiamato durante il colpo processo di rilevamento. Se è così, sarebbe davvero profondo nelle viscere senza troppe possibilità di modificare.
Le domande:
- qualcosa di sbagliato con il mio codice (potrebbe facilmente hanno perso qualcosa di ovvio ;-)
- è la sopra in realtà la ragione di fondo?
- c'è qualche opzione configurabile per forzare la spedizione? Se sì, come fare?
- dove sono le specifiche del comportamento? Guardato intorno a tutorial/api doc ma non è riuscito a trovare nulla.
esempio di codice:
package fx.control;
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
/**
* @author Jeanette Winzenburg, Berlin
*/
public class MouseEventDisabled extends Application {
private Parent getContent() {
Pane parent = new Pane();
Rectangle r = new Rectangle(100, 100, 200, 200);
r.addEventHandler(MouseEvent.ANY, event -> System.out.println(event));
CheckBox button = new CheckBox("rectangle disabled");
r.disableProperty().bind(button.selectedProperty());
parent.getChildren().addAll(r, button);
return parent;
}
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = getContent();
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch();
}
}
+1 per la domanda, a duro per sostituire i metodi di API, sono dubbio in – mKorbel