JavaFX ScrollPane: полосы прокрутки частично скрыты - PullRequest
0 голосов
/ 16 октября 2018

Я обнаружил аномалию, которая, как мне кажется, может быть ошибкой JavaFX в ScrollPane или, возможно, просто проблемой с моей композицией.

Корневым узлом является BorderPane.Левый контент - это боковая панель с использованием VBox.Эта боковая панель не имеет полосы прокрутки.Центральным содержимым является ScrollPane.

BorderPane root = new BorderPane();
MenuBar top = new MenuBar();
root.setTop(top);

VBox left = new VBox();
root.setLeft(left);

ScrollPane center = new ScrollPane();
root.setCenter(center);

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

Эти снимки экрана иллюстрируют «ошибку»: enter image description here enter image description here

Вот небольшое тестовое приложение, которое я должен воспроизвести:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ScrollPaneApplication extends Application {

    public static void main(String[] args) {
        ScrollPaneApplication.launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane root = new BorderPane();
        root.setPadding(new Insets(10, 10, 10, 10));

        final Menu menu1 = new Menu("File");
        final Menu menu2 = new Menu("Options");
        final Menu menu3 = new Menu("Help");

        final MenuBar menuBar = new MenuBar();
        menuBar.getMenus().addAll(menu1, menu2, menu3);
        root.setTop(menuBar);

        VBox leftBox = new VBox();
        addLabel(leftBox);
        leftBox.setSpacing(10);
        root.setLeft(leftBox);

        VBox box1 = new VBox();
        box1.setSpacing(10);
        addLabel(box1);

        VBox box2 = new VBox();
        box2.setSpacing(10);
        addLabel(box2);
        VBox box3 = new VBox();
        box3.setSpacing(10);
        addLabel(box3);
        VBox box4 = new VBox();
        box4.setSpacing(10);
        addLabel(box4);
        VBox box5 = new VBox();
        box5.setSpacing(10);
        addLabel(box5);

        HBox box = new HBox();
        box.setSpacing(10);
        box.getChildren().addAll(box1, box2, box3, box4, box5);

        ScrollPane scrollPane = new ScrollPane();
        scrollPane.setContent(box);
        root.setCenter(scrollPane);

        Scene scene = new Scene(root, 1024, 1024);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void addLabel(VBox parentBox) {
        TitledPane pane1 = new TitledPane();
        pane1.setPadding(new Insets(10, 10, 10, 10));
        pane1.setText("Loop 1");
        VBox box1 = new VBox();
        for (int i = 0; i < 10; i++) {
            box1.getChildren().add(new Label("Label " + i));
        }
        pane1.setContent(box1);

        TitledPane pane2 = new TitledPane();
        pane2.setPadding(new Insets(10, 10, 10, 10));
        pane2.setText("Loop 2");
        VBox box2 = new VBox();
        for (int j = 0; j < 10; j++) {
            box2.getChildren().add(new Label("Label " + j));
        }
        pane2.setContent(box2);

        TitledPane pane3 = new TitledPane();
        pane3.setPadding(new Insets(10, 10, 10, 10));
        pane3.setText("Loop 3");
        VBox box3 = new VBox();
        for (int k = 0; k < 10; k++) {
            box3.getChildren().add(new Label("Label " + k));
        }
        pane3.setContent(box3);
        parentBox.getChildren().addAll(pane1, pane2, pane3);
    }
}

1 Ответ

0 голосов
/ 16 октября 2018

TLDR: вам просто нужно сказать javafx, что он может изменить размер левого ящика, просто добавьте

leftBox.setMinHeight(0);

к вашим источникам;

Дело в том, что у вас есть этот левый VBox, иего высота зафиксирована прямо сейчас, потому что вы не указали минимальную, максимальную и предпочтительную высоту.Когда вы пытаетесь изменить размер окна, высота VBox остается неизменной.И если вы посмотрите на макет BorderPane

enter image description here

, вы увидите, что центральная область (где у вас есть панель прокрутки) в той же строке слева (гдеВы оставили VBox), поэтому минимальная высота центра ограничена левой высотой.А при изменении размеров окна высота центра не изменяется, поэтому высота полосы прокрутки не меняется, и он думает, что прокручивать там еще нечего.пока он выпадает из вашего окна просмотра

Чтобы изменить это, вы должны сказать javaFX, что он может изменить размер левой VBox до требуемых значений.И это произойдет по умолчанию при изменении размера окна.

 leftBox.setMinHeight(0);

говорит, что он может изменить размер левого бокса даже до нуля, если необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...