2016-05-12 4 views
1

У меня есть сцена JavaFX, которая содержит javafx.scene.layout.HBox. Это HBox содержит двух детей, javafx.scene.control.ComboBox, а затем javafx.scene.control.Spinner. Минимальный FXML файл, чтобы проиллюстрировать мою проблему является:JavaFX HBox Приоритет HGrow

<?import javafx.scene.control.ComboBox?> 
<?import javafx.scene.control.Spinner?> 
<?import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory?> 
<?import javafx.scene.layout.HBox?> 

<HBox xmlns="http://javafx.com/javafx/8.0.65" 
     xmlns:fx="http://javafx.com/fxml/1"> 
    <children> 
    <ComboBox fx:id="myComboBox" /> 
    <Spinner fx:id="mySpinner" editable="true"> 
     <valueFactory> 
     <SpinnerValueFactory.IntegerSpinnerValueFactory 
       min="0" max="999" initialValue="0" /> 
     </valueFactory> 
    </Spinner> 
    </children> 
</HBox> 

В коде ComboBox заселяется с очень длинными (в символах) строк. Я также задаю желаемую ширину Spinner. Следующий код представляет то, что я делаю:

@FXML 
private ComboBox<String> myComboBox; 

@FXML 
private Spinner<Integer> mySpinner; 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    myComboBox.getItems().setAll(
     "Some very long string that takes up a very large portion" + 
     " of the screen. You can probably see where this is going."); 
    mySpinner.getEditor().setPrefColumnCount(3); 
} 

желаемый эффект, что управление Spinner выделяется он предпочел ширину, и контроль ComboBox дается оставшуюся часть пространства. Однако то, что я вижу, состоит в том, что, поскольку элемент управления содержит хотя бы один очень длинный вариант, ему выделяется почти все пространство (так как его предпочтительная ширина намного больше, чем выделенное пространство). Все, что я вижу на элементе управления прядильщиком, это стрелки вверх/вниз.

Кто-нибудь знает, как я могу заставить JavaFX выделить пространство для объекта Spinner до рассмотрения предпочтительной ширины ComboBox?

+0

minWidth не помогает? –

+0

Я не знаю, что положить в 'minWidth', так как это зависит от используемого шрифта. Я заметил, что RedHat Linux использует гораздо больший шрифт по умолчанию, чем Windows 7. Не зная шрифт заранее (или настраиваемые пользователем параметры, такие как размер шрифта в Windows), трудно определить магические числа, необходимые для создания 'minWidth' полезно. –

+0

Вы можете получить шрифт 'Spinner':' spinner.getEditor(). GetFont() ' – jns

ответ

4

Ваше решение работает, но проще установить minWidth объекта Spinner равным предпочтительной ширине. Измените исходный FXML на следующее:

... 
<Spinner fx:id="mySpinner" editable="true" minWidth="-Infinity"> 
<ComboBox fx:id="myComboBox" HBox.hgrow="ALWAYS" maxWidth="Infinity" /> 
... 

Это эквивалентно тому, выполнив следующие действия в коде:

mySpinner.setMinWidth(Region.USE_PREF_SIZE); 

Оставив все остальное то же самое, либо одна из этих изменений даст желаемый результат.

+0

Мне нравится это решение лучше, чем у меня по двум причинам: я не знал, что вы можете установить свойство 'hgrow' в FXML, и, поскольку он избавляется от магического числа для' myComboBox .prefWidth'. –

0

Я понял, как это решить. В FXML, мне нужно указать как prefWidth и maxWidth на ComboBox элемент:

... 
<ComboBox fx:id="myComboBox" prefWidth="200" maxWidth="Infinity" /> 
... 

Затем в методе инициализации, мне пришлось добавить следующую строку:

HBox.setHgrow(myComboBox, Priority.ALWAYS); 

Это помогло устранить проблему , Теперь я вижу еще одну проблему, которая заключается в том, что управление Spinner нигде не приближается к 3-символьным размерам. Однако, поскольку это вне темы, я открою еще один вопрос для этой нерешенной проблемы.

+0

Вы должны установить minSize для' Spinner', тогда вам не нужно будет устанавливать hGrow для 'ComboBox' – jns

+0

Можете ли вы уточнить свою рекомендацию по использованию 'minSize'? Когда я добавляю 'minWidth =" 1 "minHeight =" 1 "' в 'Spinner' FXML и удаляю свойства' prefWidth' и 'maxWidth' из' ComboBox', я все равно получаю почти 0-ширину 'Spinner' (JRE 8u77 на Win 7 Enterprise SP1 x64). Вы видите что-то другое, или я неправильно интерпретирую вашу рекомендацию? –

+0

Вы правы. Вы должны установить hGrow для comboBox.Что касается minWidth, я добавил ответ – jns

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