2012-10-31 3 views
2

Est-il possible de faire défiler automatiquement un contrôle ScrollPane lorsque la hauteur du contenu augmente? Par exemple, j'ai un TitledPane en bas de l'écran (à l'intérieur d'un ScrollPane) et quand je l'agrandis, j'aimerais que le ScrollPane défile vers le bas pour que je puisse voir tout le contenu du TitledPane.JavaFX scrollpane scroll down

Répondre

3

Vous pouvez obtenir ce comportement avec une combinaison de titledPane.localToScene() et scrollPane.setVvalue()

Le premier est d'obtenir les coordonnées de titledPane tandis que le second est de définir la position de la barre verticale scrollpane. Notez que sa plage est comprise entre 0 et 1.

+0

J'ai au sujet d'un problème similaire. Je dois monter/descendre le titre. Comment puis-je faire? Principalement, je veux mettre en œuvre les fonctionnalités de la fenêtre de sortie IntelliJ. Cette fenêtre peut être déplacée vers le haut/bas avec la souris. – alhelal

0

Je l'ai fait en utilisant un AnimationTimer. J'ai dû attendre 100000000 nanosecondes pour être sûr que le ScrollPane avait réagi à la Titlepane étendu.

public void scrollNodeInTopScrollPane(Node n, ScrollPane s) { 
    final Node node = n; 
    final ScrollPane clientTopScrollPane = s; 
    AnimationTimer timer = new AnimationTimer() { 
     long lng = 0; 
     @Override 
     public void handle(long l) { 
      if (lng == 0) { 
       lng = l;     
      }     
      if (l > lng + 100000000) {     
       if (node.getLocalToSceneTransform().getTy() > 20) {      
        clientTopScrollPane.setVvalue(clientTopScrollPane.getVvalue() + 0.05);       
        if (clientTopScrollPane.getVvalue() == 1) { 
         this.stop();       
        } 
       } else { 
        this.stop(); 
       } 
      }     
     } 
    }; 
    timer.start(); 
} 
1

Vous devez indiquer à scrollpane où se trouvent les coordonnées actuelles avant de passer une valeur à la barre verticale ou horizontale.

Ce code fonctionne assez bien pour moi:

// the owner's node of your scrollPane; 
titledPane.layout(); 
// the maxValue for scrollPane bar (1.0 it's the default value) 
scrollPane.setVvalue(1.0d); 

Vous avez à coder ce où pousse votre scrollpane. Par exemple, si vous ajoutez des nœuds au nœud interne du panneau déroulant, ajoutez un écouteur à sa liste des enfants.

Si le nœud interne du panneau de configuration change de hauteur, ajoutez un écouteur à heightProperty.

Par exemple, le noeud intérieur de votre scrollpane il est un AnchorPane et vous ajoutez des nœuds à ce volet, donc comme cela:

anchorPane.getChildren().addListener( 
    (ListChangeListener.Change<? extends Node> c) -> { 
     titledPane.layout(); 
     scrollPane.setVvalue(1.0d); 
    } 
); 

Si c'est la hauteur qui pousse ...

heightProperty().addListener(
    (observable, oldValue, newValue) -> { 
     titledPane.layout(); 
     scrollPane.setVvalue(1.0d); 
    } 
); 

C'est tout!

10

Vous pouvez bind la propriété ScrollPanevvalue avec le heightProperty du conteneur interne. Par exemple, si vous avez un VBox dans votre ScrollPane:

scrollPane.vvalueProperty().bind(vBox.heightProperty()); 
+0

Wow ... cette solution fonctionne pour moi. mais, pouvez-vous expliquer plus? – Fadhil

+0

il masquera le panneau titre supérieur. – KeepMove

Questions connexes