Как изменить размер содержимого JavaFX ScrollPane, чтобы он соответствовал текущему размеру

У меня есть BorderPane с ScrollPane в качестве центрального элемента. Он автоматически изменяет размер, чтобы заполнить экран. Внутри ScrollPane находится HBox, который не имеет содержимого, но является целью перетаскивания. Поэтому я хочу, чтобы он заполнил своего родителя ScrollPane.

Каков предпочтительный способ сделать это?

До сих пор я пытался переопределить метод ScrollPane.resize(...) для изменения размера HBox, но это кажется довольно сложным и неортодоксальным.

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

@Override
public void resize(double width, double height) {
    super.resize(width, height);

    double scrollBarHeight = 2;
    double scrollBarWidth = 2;

    for (final Node node : lookupAll(".scroll-bar")) {
        if (node instanceof ScrollBar) {
            ScrollBar sb = (ScrollBar) node;
            if (sb.getOrientation() == Orientation.HORIZONTAL) {
                System.out.println("horizontal scrollbar visible = " + sb.isVisible());
                System.out.println("width = " + sb.getWidth());
                System.out.println("height = " + sb.getHeight());
                if(sb.isVisible()){
                    scrollBarHeight = sb.getHeight();
                }
            }
            if (sb.getOrientation() == Orientation.VERTICAL) {
                System.out.println("vertical scrollbar visible = " + sb.isVisible());
                System.out.println("width = " + sb.getWidth());
                System.out.println("height = " + sb.getHeight());
                if(sb.isVisible()){
                    scrollBarWidth = sb.getWidth();
                }
            }
        }
    }

    hBox.setPrefSize(width-scrollBarWidth, height-scrollBarHeight);
}

Код частично взят отсюда: Как получить доступ к полосам прокрутки панели прокрутки


person Lennert    schedule 10.07.2013    source источник
comment
Все в порядке, я просто иногда ставил hgrow и vgrow, и теперь это работает.   -  person user7867610    schedule 14.04.2017


Ответы (2)


Пытаться

ScrollPane scrollPane = new ScrollPane();
scrollPane.setFitToHeight(true);
scrollPane.setFitToWidth(true);

без переопределения метода resize().

person Uluk Biy    schedule 10.07.2013
comment
Как я и думал, должен быть очевидный способ, которого я просто не нашел. Большое спасибо за ваш ответ! - person Lennert; 11.07.2013
comment
Каков метод доступа для setFitToHeight и setFitToWidth в xml? - person Andres S; 21.01.2015
comment
@Andrew121007 это <ScrollPane fx:id="scrollPane" fitToHeight="true" fitToWidth="true"> - person Uluk Biy; 22.01.2015

Установка атрибута fitToHeight или fitToWidth через XML или CSS:

FXML:

<ScrollPane fx:id="myScrollPane" fitToHeight="true" fitToWidth="true" />

CSS:

.my-scroll-pane {
    -fx-fit-to-height: true;
    -fx-fit-to-width: true;
}
person NDY    schedule 07.04.2015
comment
Мне нравится использовать ScrollPane вместо чего-то вроде .my-scroll-pane, чтобы сделать все это автоматически, тогда никаких изменений FXML не требуется ... вероятно, должно быть по умолчанию. - person User; 18.01.2017
comment
@Manius это правда, но вы должны быть осторожны, чтобы сделать это конкретным, иначе все ваши панели прокрутки ведут себя одинаково, и, вероятно, вы этого не хотите. - person NDY; 31.01.2017
comment
Я хотел бы добавить, что эта опция доступна в Scene Builder. В любой области прокрутки в разделе «Макет» -> «Конкретный» (второй сверху) -> Подогнать по ширине/высоте. Мне потребовалось некоторое время, чтобы найти, надеюсь, это кому-то поможет. - person Doctor Parameter; 05.05.2017