центрирование содержимого ScrollPane с fitToWidth=false с использованием JavaFX

Здравствуйте у меня следующая ситуация:

<ScrollPane xmlns:fx="http://javafx.com/fxml" fx:controller="MenuController" fx:id="menuPane" stylesheets="/fxml/styles/menu_style.css" fitToWidth="true" fitToHeight="true" hbarPolicy="ALWAYS" vbarPolicy="ALWAYS">
  <VBox alignment="CENTER">
    <HBox alignment="CENTER">
      <VBox fx:id="menuView">
        <elements></elements>
      </VBox>
    </HBox>
  </VBox>
</ScrollPane>

Это выглядит так:

Полный экран с выравниванием

Полный экран с выравниванием

Однако, когда вы уменьшаете его по ширине, панель прокрутки не работает.

Размер изменен с выравниванием

Изменен размер с выравниванием

Когда я изменил значение fitToWidth с true на false, я получаю:

Полный экран с прокруткой

Полный экран с прокруткой

поэтому нет горизонтального выравнивания по центру. Однако прокрутка работает:

Размер изменен с помощью прокрутки

Размер изменен с помощью прокрутки

Есть ли возможность одновременной работы выравнивания и прокрутки?

Странно, что прокрутка по высоте и выравнивание по вертикали работают нормально.

Нельзя добавить больше 2-х фото, извините.


person Robert Mielczarek    schedule 19.04.2016    source источник


Ответы (1)


Когда ширина области просмотра меньше ширины содержимого, то, конечно, положение содержимого определяется положением горизонтальной полосы прокрутки, что, по-видимому, вам и нужно.

Когда ширина области просмотра больше ширины содержимого, положение дочернего узла содержимого определяется макетом содержимого и любым установленным для него выравниванием. Положение самого контента в области просмотра зависит от макета области просмотра, и вы имеете ограниченный контроль над этим (насколько я понимаю).

Таким образом, один из вариантов — просто привязать минимальную ширину содержимого к фактической ширине области просмотра, заставив содержимое быть как минимум таким же большим, как область просмотра. Вы можете сделать это в FXML:

<ScrollPane xmlns:fx="http://javafx.com/fxml" fx:controller="MenuController" fx:id="menuPane" stylesheets="/fxml/styles/menu_style.css" fitToWidth="true" fitToHeight="true" hbarPolicy="ALWAYS" vbarPolicy="ALWAYS">
  <VBox alignment="CENTER" minWidth="${menuPane.viewportBounds.width}">
    <HBox alignment="CENTER">
      <VBox fx:id="menuView">
        <elements></elements>
      </VBox>
    </HBox>
  </VBox>
</ScrollPane>
person James_D    schedule 19.04.2016
comment
Он начал работать, когда я добавил в Hbox minWidth. Тему можно закрыть как решенную. Спасибо, Джеймс_Д. ‹Выравнивание HBox=ЦЕНТР minWidth=${menuPane.viewportBounds.width}› - person Robert Mielczarek; 19.04.2016
comment
Ты спасатель! Также я узнал, что я могу связываться напрямую через FXML! ‹3 - person Cherusker; 31.05.2017