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
Quels sont les résultats concrets que vous obtenez? Ou sont-ils différents à chaque fois? – Itai
(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 (...)'. –