JavaFX 2.0: récupère les éléments arborescents ou les nœuds actuellement visibles à l'écran


J'ai TreeView<TitledPane> et je veux afficher uniquement le contenu "non lu" de TitledPane.

Je voudrais qu'un événement soit notifié si le contenu de TitledPane est visible à l'écran.

TitledPane a expandedProperty(), donc effondré, mais je ne vois rien pour filtrer les TreeItems qui sont loin sur TreeView et non affichés.

Une autre façon potentielle à laquelle j'ai pensé est de vérifier la visibilité du nœud assis dans TitledPane en utilisant visibleProperty, mais cela semble ne pas fonctionner.

pane.visibleProperty().addListener(new EnhancedListener(pane));

private class EnhancedListener implements ChangeListener<Boolean>
{
    Node parent;
    EnhancedListener(Node parent)
    {
        this.parent = parent;
    }
    @Override
    public void changed(ObservableValue<? extends Boolean> arg0, 
                        Boolean arg1, Boolean arg2) {
        TitledPane p = (TitledPane) parent;
        System.out.println(((Label)p.getContent()).getText()+" " + arg2);
    } 
}

J'utilise JavaFX 2.0.3

Author: damik, 2012-04-12

1 answers

Voir ce fil de discussion du forum JavaFX"ListView Visible Items" et l'entrée de base de données associée JavaFX issue"La visibilité des éléments dans les composants défilables devrait être dans l'API" pour une demande d'amélioration pour faciliter la réalisation de ce que vous recherchez.

Le visibleProperty est de savoir s'il est possible qu'un élément soit vu lorsqu'il est ajouté à une scène, pas s'il est actuellement affiché (par exemple si un clip ou un défilement du nœud de mise en page empêche actuellement un nœud enfant d'être affiché, le nœud enfant peut toujours avoir une valeur visibleProperty de true, même si vous ne pouvez pas la voir actuellement). Donc, en bref, comme vous l'avez découvert, cela ne vous aidera pas ici.

Le fil de discussion du forum lié ci-dessus fournit la solution de contournement suivante pour ListView, que vous pourrez peut-être adapter à votre situation TreeView, bien que vous deviez trouver un moyen de savoir que les cellules rendues de TreeView affichées sur la scène changent pour déclencher l ' "événement" dont vous avez besoin.

VirtualFlow vf = ((VirtualFlow)((ListViewSkin)myList.getChildrenUnmodifiable().get(0)).getChildrenUnmodifiable().get(0));
System.out.println(vf.getFirstVisibleCell().getIndex()+", "+vf.getLastVisibleCell().getIndex());
 4
Author: jewelsea, 2012-04-17 00:23:24