2015-04-07 4 views
8


У меня проблема с JavaFX (8), HBox, ComboBox и HGrow. HGrow не работает в сочетании с ComboBox.

(INFO: с TextField (вместо ComboBox), он работает, как ожидалось)JavaFX - Как сделать ComboBox hgrow?

Это мой FXML-код:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<VBox prefHeight="117.0" prefWidth="285.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.test.TestController"> 
    <children> 
    <HBox prefHeight="105.0" prefWidth="196.0" VBox.vgrow="ALWAYS"> 
    <children> 
     <ComboBox fx:id="fxCboTest" prefHeight="25.0" prefWidth="62.0" HBox.hgrow="ALWAYS" /> 
    </children> 
    </HBox> 
    </children> 
</VBox> 

этот код приведет:

enter image description here

Я также пробовал следующий код (без успеха, этот код ничего не делает):

HBox.setHgrow(uiController.fxCboTest, Priority.ALWAYS); 

Есть ли у кого-нибудь идеи, как сделать ComboBox HGrow?

ответ

17

Это ответ на мой вопрос.
После некоторого тестирования я обнаружил, что при установке Максимальная ширина в MAX_VALUE, он работает:

enter image description here

Это приведет следующий код/​​XML из SceneBuilder:

... 
<children> 
    <ComboBox maxWidth="1.7976931348623157E308" prefWidth="150.0" HBox.hgrow="ALWAYS" /> 
</children> 
... 

где 1.7976931348623157E308 выглядит как Double.MAX_VALUE.

Это также будет работать с несколькими элементами управления в Hbox.
enter image description here

На мой взгляд, это не очень следовательно,/последовательно.
Я все еще не понимаю, почему HGrow не работает для ComboBox.

+0

'hgrow' не будет переопределять максимальную ширину изменяемого узла, которая по умолчанию установлена ​​на предпочтительный размер. Немного информации об этом в [учебнике] (http://docs.oracle.com/javase/8/javafx/layout-tutorial/size_align.htm#JFXLY133), а также отличная [презентация в Parleys] (https: //www.parleys.com/tutorial/interface-layout-javafx-2-0) (требуется регистрация). –

+1

Итак, почему это работает, только что заменив ComboBox на TextField в XML? – Ben

+4

Немного покончить с настройками по умолчанию. Значения 'maxWidth' для обоих значений для дознания' Region.COMPUTED_SIZE', что вызывает вызов 'computeMaxWidth (...)'. Для элементов управления это в свою очередь делегирует реализацию скина.Копаясь в исходном коде, 'ComboBoxBaseSkin' разрешает это, возвращая предпочтительную ширину; 'TextFieldSkin' просто наследует реализацию' SkinBase' по умолчанию, которая возвращает 'Double.MAX_VALUE'. Следовательно, поле со списком по умолчанию ограничено его предпочтительным размером; текстовое поле разрешено расти неограниченно. Суть в том, что у них разные значения по умолчанию. –

1

Это взлом, но он должен работать. Внутри метода инициализации контроллера определите привязку.

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    fxCboTest.prefWidthProperty().bind(hbox.widthProperty()); 
} 
+0

Спасибо за ваше предложение, но этот код может не работать должным образом, когда (не в моем примере кода, потому что я хочу, чтобы мой пример был как можно более простым), hbox содержит несколько элементов управления, например ComboBox и Button. Я хочу избежать слишком большого вычисления самостоятельно. – Ben

+0

Вопрос никогда не упоминался о том, что вы хотели иметь несколько детей в HBox. – ItachiUchiha

+0

Вы правы, поэтому я добавляю комментарий к вашему ответу, почему ваше решение ** может ** не работать с несколькими элементами управления. я не сказал, что ваше решение абсолютно бесполезно. – Ben