2013-08-07 9 views
5

Ho un ScrollPane nella mia scena e vorrei aggiungere una serie di nodi. L'importo esatto deve essere dinamico. Ho testato il concetto con i nodi Label e posso aggiungere con successo tante etichette quanto voglio al contenuto di ScrollPane (attualmente un VBox).JavaFX - Aggiunta di nodi a ScrollPane con direzione di scorrimento corretta

Il mio problema è capire come consentire all'utente di scorrere normalmente attraverso il ScrollPane pieno di nodi. Il contenuto corrisponde alla barra di scorrimento; cioè, quando si scorre verso il basso, il contenuto si sposta verso il basso. Scorro verso l'alto, il contenuto scorre verso l'alto. Quindi, se ho 10 etichette, di cui solo cinque sono attualmente visibili, l'azione istintiva per vedere le altre cinque sarebbe quella di scorrere verso il basso. Sfortunatamente, questo sposta solo l'intero contenuto verso il basso, esponendo lo spazio vuoto in alto e nascondendo più etichette.

posso postare alcuni esempi di codice se questo aiuta, ma il succo del mio piano di attacco è questo:

ScrollPane sp = new ScrollPane(); 
VBox content = new VBox(); 
sp.setContent(content); 
for (int i = 0; i < 10; i++) 
{ 
    Label label = new Label("Label " + i); 
    content.setPrefHeight(content.getPrefHeight() + label.getPrefHeight()); 
    content.getChildren().add(label); 
} 

Perché io uso un VBox, le etichette sono impilati (in asse Y) in cima a uno un altro, che è quello che voglio. Man mano che vengono aggiunte più etichette, ScrollBar deve riflettere la maggiore dimensione del VBox. Ho provato alcuni approcci per farlo funzionare, incluso il metodo ScrollPane.setVmax(), che è ok, ma ho ancora il problema della direzione di scorrimento che sposta il contenuto nella direzione sbagliata. Ho anche provato un EventHandler e EventFilter per modificare i valori di conseguenza, ancora senza risolvere il problema delle pergamene che non spostano il contenuto nella giusta direzione.

La risposta sembra così semplice, eppure continua a sfuggirmi, anche dopo molte lunghe ore incasinate con il codice.

EDIT: suggerimento

di jewelsea di utilizzare un ListView risolto il mio problema. Tuttavia, rimango curioso sul motivo per cui l'utilizzo di uno ScrollPane non è andato così bene. Inoltre, ho avuto un comportamento strano con l'implementazione ListView: utilizzo un pulsante per aggiungere manualmente un nuovo Label alla vista. Ogni tanto, la vista si blocca dopo aver aggiunto un nuovo Label. Si blocca per alcuni secondi prima di aggiornare la posizione di scorrimento o di visualizzare la nuova aggiunta Label. Non so se questo è dovuto al fatto che ci sono circa 20 o più istanze di Label gestite dalla vista o se qualcosa di più insidioso è in gioco.

+2

Qualsiasi motivo per non utilizzare un 'ListView' per implementarlo? Penso che possa prendersi cura di questo tipo di problemi per te. – jewelsea

+2

@jewelsea, l'hai risolto! Sono sempre stupito di come la maggior parte di questi problemi sembri così grande eppure la loro soluzione sia così semplice. Sono stato in grado di usare un 'ListView

risposta

0

Riguardo ai problemi di scorrimento, so che cosa stai cercando di fare è possibile perché sto facendo qualcosa di molto simile. In base allo snippet di codice che hai indicato, ti suggerisco di provare alcune cose ...

  • Assegna al ScrollPane un'altezza e una larghezza preferite.
  • Non dare al contenuto VBox alcuna preferenza di dimensionamento in altezza in quanto crescerà con il suo contenuto. Non ci dovrebbe essere bisogno di aggiornare la sua altezza dopo aver aggiunto il contenuto.
  • Usa setAlignment il metodo del VBox per allineare il suo contenuto sia TOP_LEFT, TOP_CENTER, o TOP_RIGHT.
  • essere cauti quando si utilizza il getPrefHeight() metodo, perché se non hai usato setPrefHeight() anticipo credo tornerà -1.

Spero che questo ti aiuti!

+0

Mentre non è nel frammento sopra, stavo impostando le dimensioni di ScrollPane in modo esplicito (in Scene Builder e il mio codice). Ho anche commutato tra il disordine dell'altezza del contenuto e ho specificato un allineamento. Sono stato in grado di aggiungere le cose dopo un po 'di confusione, ma non riuscivo ancora a scorrere come volevo. –