2013-10-04 10 views
7

Sto utilizzando JavaFX in un progetto anziché Swing a causa del multimedia avanzato, del visualizzatore web e della possibilità di utilizzare effetti visivi. Tuttavia, ciò che ho imparato da quello che ho trovato sul web (http://docs.oracle.com/javafx/2/layout/jfxpub-layout.htm e altri) è che JavaFX gestori di layout messa a fuoco sul ridimensionamento delle dimensioni del genitore in base alla dimensione del contenuto, mentre swing concentra su ridimensionamento del contenuto in base al genitore, almeno in base allo Layout utilizzato.Layout JavaFX scalabile con il genitore

In questo momento sto utilizzando un Accordion con alcuni TitledPane bambini. Uno di questi contiene uno GridPane per il semplice motivo che è il modo migliore che conosco per emulare uno GridLayout (come ho appreso dalla mia domanda precedente qui: JavaFX layout equivalent to GridLayout). Voglio che il contenuto di TitledPane divida in 2 righe e 1 colonna, ogni riga con un'altezza del 50% dello spazio disponibile nel TitledPane (ridimensionamento con lo Stage o Scene), equivalente a ciò che un all'interno di un BorderLayout.CENTER compirebbe . Per questo, ho aggiunto uno GridPane con 2 RowConstraint s utilizzando setPercentHeight(50) e 1 ColumnConstraint con setPercentWidth(100). Tuttavia, ho notato che il contenuto si sta ridimensionando correttamente con la griglia, ma la griglia non occupa tutto lo spazio disponibile nel TitledPane (perché apparentemente non si comporta come il centro di BorderPane). Ho anche provato con setMaxWidth per rendere il contenuto in scala con il genitore, ma non sembra funzionare neanche (come detto qui: JavaFX: How to make my custom component use all available space from parent layout?). E anche se lo fosse, ho bisogno di impostare la larghezza massima per OGNI discendente nella mia struttura ad albero dell'interfaccia utente per avere tutte le proporzioni?

In entrambi i casi, qualcuno sa come creare uno TitledPane con due spazi uguali al di sotto di ciascuno di quella scala con le dimensioni del titledpane?

column width does not take up all available space

risposta

9

Infatti, il vostro gridpane sta crescendo a riempire tutto il suo genitore. Considerare il codice seguente, ho aggiunto un colore di sfondo (rosso) alla griglia per scopi di debug.

Accordion accordion = new Accordion(); 
TitledPane titledPane = new TitledPane(); 
titledPane.setText("Title"); 
GridPane gridPane = new GridPane(); 
gridPane.setStyle("-fx-background-color:red"); 

gridPane.add(new TextArea("Hello"), 0, 0); 
gridPane.add(new TextArea("World"), 0, 1); 

titledPane.setContent(gridPane); 
accordion.getPanes().add(titledPane); 

Se si esegue questo codice, il gridpane riempirà tutto il suo genitore (controllare il colore rosso si estende in tutto il contenuto titledpane).

Tuttavia, il contenuto della griglia non riempirà tutta la colonna. Se provi a ridimensionare la finestra, vedrai che le aree di testo non cambiano in larghezza insieme alla griglia. Per risolvere il problema, è necessario dire alla prima colonna della griglia di crescere con la griglia stessa. Il modo per farlo è quello di aggiungere il seguente vincolo:

ColumnConstraints columnConstraints = new ColumnConstraints(); 
columnConstraints.setFillWidth(true); 
columnConstraints.setHgrow(Priority.ALWAYS); 
gridPane.getColumnConstraints().add(columnConstraints); 
+0

potrebbe dirmi qual è la differenza tra il setPercentWidth (100) e setFillWidth (vero) + setHgrow (Priority.ALWAYS)? – Warkst

+1

setPercentWidth funzionerebbe, invece di setHGrow (Priority.ALWAYS). Entrambi faranno la stessa cosa nel caso in cui si stia utilizzando solo una colonna. Nel caso tu abbia più colonne, funzionerebbero diversamente. Perché setHGrow proverà a dire al layout quale colonna del reticolo deve crescere per riempire lo spazio disponibile non reclamato. – Rasha

+1

setFillWidth (true) è per il contenuto della colonna, non per la colonna stessa. Il default è vero, penso. Quindi non è necessario impostarlo. Ciò che significa è se i figli della colonna saranno regolati per riempire tutta la larghezza della colonna. – Rasha

Problemi correlati