2013-10-04 3 views
7

Я использую JavaFX в проекте вместо Swing из-за улучшенного мультимедиа, веб-просмотра и возможности использовать визуальные эффекты. Однако то, что я узнал от того, что я нашел в Интернете (http://docs.oracle.com/javafx/2/layout/jfxpub-layout.htm и другие), что JavaFX менеджеры компоновки акцент на масштабирование размера родителя на основе размера содержимого, в то время как свинг сосредоточивается на , масштабируя содержимое в соответствии с родительским, по меньшей мере, на основе используемого Layout.Макет JavaFX, который масштабируется с родителем

Сейчас я пользуюсь Accordion с некоторыми детьми TitledPane. Один из них содержит GridPane по той простой причине, что это лучший способ, который я знаю, чтобы подражать GridLayout (как я узнал из своего предыдущего вопроса здесь: JavaFX layout equivalent to GridLayout). Я хочу, чтобы раздел контента TitledPane разбился на 2 строки и 1 столбец, каждая строка с 50% высоты доступного пространства в TitledPane (масштабирование с помощью Stage или Scene), что эквивалентно тому, что GridLayout(2,1) внутри BorderLayout.CENTER достигнет , Для этого я добавил GridPane с 2 RowConstraint с использованием setPercentHeight(50) и 1 ColumnConstraint с setPercentWidth(100). Тем не менее, я заметил, что содержимое масштабируется с сеткой должным образом, но сетка не занимает все свободное место в TitledPane (потому что, по-видимому, она не действует как центр BorderPane). Я также пробовал с setMaxWidth, чтобы сделать масштаб содержимого с родителем, но он, похоже, не работает (как сказано здесь: JavaFX: How to make my custom component use all available space from parent layout?). И даже если бы это было, мне нужно установить максимальную ширину для КАЖДОГО потомка в моем дереве элементов пользовательского интерфейса, чтобы все они масштабировались?

В любом случае, кто-нибудь знает, как сделать TitledPane с 2 равными пробелами в нем под каждой другой, которые масштабируются с размером под названием pane?

column width does not take up all available space

ответ

9

В самом деле, ваш gridpane растет, чтобы заполнить все его родителя. Рассмотрите приведенный ниже код, я добавил цвет фона (красный) в gridpane для целей отладки.

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); 

Если выполнить этот код, то gridpane заполнит все его родителя (проверьте красный цвет охватывает все над содержанием titledpane).

Однако содержимое сетки не заполнит весь столбец. Если вы попытаетесь изменить размер окна, вы увидите, что текстовые области не изменяются в ширину вместе с сеткой. Чтобы исправить это, вам нужно сообщить, что первый столбец сетки будет расти с самой сеткой. Способ сделать это, чтобы добавить следующее ограничение:

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

Не могли бы вы сказать мне, что разница между setPercentWidth (100) и setFillWidth (истина) + setHgrow (Priority.ALWAYS)? – Warkst

+1

setPercentWidth также будет работать, а не setHGrow (Priority.ALWAYS). Они оба сделают то же самое, если вы используете только один столбец. Если у вас несколько столбцов, они будут работать по-другому. Потому что setHGrow попытается сказать макет, который столбец gridpane должен вырасти, чтобы заполнить невостребованное доступное пространство. – Rasha

+1

setFillWidth (true) предназначен для содержимого столбца, а не для самого столбца. По умолчанию это правда. Поэтому вам не нужно его устанавливать. Это означает, будут ли отрегулированы дети столбца, чтобы заполнить всю ширину столбца. – Rasha

Смежные вопросы