2017-07-20 5 views
3

Je suis tenté d'utiliser des pseudo-classes dans une requête programmée en utilisant Node.lookupAll(), mais cela semble donner des résultats inattendus.Utilisation de requêtes contenant des pseudo-classes dans JavaFX

J'ai cherché en ligne et ne trouve rien à suggérer Node.lookupAll() ne soutiendrait pas les classes de Psuedo ...

public class Foo extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     PseudoClass pseudoClass = PseudoClass.getPseudoClass("custom"); 

     Label a = new Label(); 
     a.getStyleClass().add("foo"); 
     a.pseudoClassStateChanged(pseudoClass, false); 

     Label b = new Label(); 
     b.getStyleClass().add("foo"); 
     b.pseudoClassStateChanged(pseudoClass, true); 

     Label c = new Label(); 
     c.getStyleClass().add("foo"); 
     c.pseudoClassStateChanged(pseudoClass, true); 


     HBox box = new HBox(a, b, c); 
     primaryStage.setScene(new Scene(box)); 

     System.out.println(box.lookupAll(":custom").size()); // expected 2 
     System.out.println(box.lookupAll(".foo:custom").size()); // expected 2 
     System.out.println(box.lookupAll(".foo").size()); // expected 3, got 3 
     System.out.println(box.lookupAll(":magichorse").size()); // expected 0 !! 

    } 

} 

Sortie

4 
3 
3 
4 
+0

Quels sont les résultats concrets que vous obtenez? Ou sont-ils différents à chaque fois? – Itai

+0

(Notez qu'il y a un bug copier-coller dans le code de test sur les appels à 'pseudoClassStateChanged (...)', même si cela ne fait aucune différence.) On dirait qu'il ignore complètement la pseudo-classe dans la recherche. ': custom' et': magichorse' donnent le 'HBox' et les trois labels (même chose que' lookup ("*") '),' .foo: custom' et '.foo' donnent les trois labels. Cela semblerait être un bug (au moins dans la documentation: si les pseudoclasses ne sont pas supportées dans les recherches, cela devrait être documenté). Une solution possible consiste simplement à filtrer la recherche via 'getPseudoClassStates(). Contains (...)'. –

Répondre

1

Cela ne semble être un bug, ou au moins une fonctionnalité non documentée. Personne n'a dit le contraire, et l'équipe du JDK a accepté mon rapport de bug.

Voir JDK-8185831

Pour contourner ce problème getPseudoClassStates().contains(...) peut être utilisé à la place.