2014-06-12 11 views
5

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(); 
    } 
} 

risposta

4

public final ReadOnlyBooleanProperty disabledProperty

Indica se questo nodo è disattivato. Un nodo diventerà disabilitato se disable è impostato su true su uno stesso o su uno dei suoi antenati nel grafico di scena. Un nodo disabilitato dovrebbe renderizzare in modo diverso per indicare all'utente lo stato disabilitato. Tale rendering disabilitato dipende dall'implementazione del nodo. Le classi di forma contenute in javafx.scene.shape non implementano tale rendering per impostazione predefinita, pertanto le applicazioni che utilizzano le forme per la gestione degli input devono implementare la resa disabilitata appropriata. I controlli dell'interfaccia utente definiti in javafx.scene.control implementeranno comunque il rendering sensibile ai disabili.

A disabled Node does not receive mouse or key events.

Valore di default: falso Vedere anche: isDisabled(), setDisabled (booleano)

+0

+1 per la domanda, a duro per sostituire i metodi di API, sono dubbio in – mKorbel

Problemi correlati