JavaFX: панель прокрутки не соответствует родительскому

95
8

Я хотел бы создать следующую сцену:


+-----------------------------------------------+
|ROOT (=BorderPane) |
| |
| +-------------------------------------------+ |
| |TOOL BAR | |
| |(north) | |
| +-------------------------------------------+ |
| |
| +-------------------------------------------+ |
| |MyConfigurationComponent extends BorderPane| |
| |(center) | |
| | +-------------------------+ +---------+ | |
| | |ScrollPane | | | | |
| | |(center) | | | | |
| | | +---------------------+ | | | | |
| | | | | | | | | |
| | | | | | | SIDE | | |
| | | | CANVAS | | | PANE | | |
| | | | | | | (right) | | |
| | | | | | | | | |
| | | | | | | | | |
| | | +---------------------+ | | | | |
| | | | | | | |
| | +-------------------------+ +---------+ | |
| | | |
| +-------------------------------------------+ |
| |
+-----------------------------------------------+

Expectation


Я хотел бы сделать ScrollPane максимально большим. Это означает, что ScrollPane должен расти и заполнять всю область, независимо от размера сцены.


Поскольку и TOOL BAR, и SIDE PANE имеют фиксированную (предпочтительную) ширину и высоту, я думал, что ScrollPane растянет и заполнит всю оставшуюся область.


Фактическое поведение


Но это не так. ScrollPane каким-то образом волшебным образом устанавливает свой минимальный размер примерно в 40х40. Высота растягивается в соответствии с высотой SIDE PANEL, но ширина остается прежней, и ничто не может ее изменить.


Фактически, единственное, что делает ScrollPane больше, заключалось в том, чтобы явно установить minWidth на некоторое значение (т.е. 400). Но это не решает проблему обрезки ScrollPane.


Когда я устанавливаю цвет фона в MyConfigurationComponent, я вижу, что цвет фона заполняет всю область, как ожидалось (поэтому проблема не в MyConfigurationComponent). По-видимому, его центральный дочерний элемент (ScrollPane) отображается как левый, его правый ребенок (SIDE PANEL) как центр, потому что все остальные области с правой стороны остаются пустыми (но с фоном, поэтому он все еще MyConfigurationComponent!).


Что я пробовал


    установите min, pref и max размеры ScrollPane для определенных значений
    привязать предпочтительный размер к размеру родителя
    установите fitToWidth и fitToHeight в true
    wrap ScrollPane с AnchorPane с привязкой ко всем четырем сторонам
    wrap ScrollPane с VBox и установить приоритет для всех

Текущее обходное решение


Привяжите ширину MyConfigurationComponent минус ширина от SIDE PANEL до ScrollPane. Неправильно по-разному.


код


ROOT.fxml


<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cz.upol.fapapp.cfa.gui.frame.FxCFAConfigFrameController">
<top>
<ToolBar>
<Button text="Some button" />
</ToolBar>
</top>
<center>
<MyConfigurationComponent fx:id="configComp" />
</center>
</BorderPane>

MyConfigurationComponent.fxml


<BorderPane xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1">
<center>
<ScrollPane fx:id="scrollPane">
<content>
<Canvas width="2000" height="2000" />
</content>
</ScrollPane>
</center>
<right>
<VBox prefWidth="100.0" BorderPane.alignment="CENTER_RIGHT">
<children>
<Label text="Colors" />
<ComboBox fx:id="cmbColors" prefWidth="100.0" />
<!-- ... -->
<Separator prefHeight="15.0" prefWidth="100.0" />
<Button mnemonicParsing="false" text="Action 1" />
<Button mnemonicParsing="false" text="Action 2" />
</children>
</VBox>
</right>
</BorderPane>

Вопросы


    BorderPane центр расширяет свой размер, чтобы заполнить контент, не так ли?
    Может ли это быть вызвано BorderPane внутри BorderPane?
    Есть ли лучшее решение, чем "мое обходное решение"?

спросил(а) 2017-08-31T21:36:00+03:00 2 года, 11 месяцев назад
0
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема