Центрирование области прокрутки в сцене при изменении размера окна - PullRequest
1 голос
/ 08 мая 2020

Привет, у меня есть ScrollPane с GridPane в качестве дочернего,

ScrollPane scroll = new ScrollPane(grid);
        Scene scene = new Scene(scroll);

Кто-нибудь знает, как центрировать элементы ScrollPane в сцене даже при изменении размера окна?

1 Ответ

0 голосов
/ 08 мая 2020

Если я правильно понял вопрос, вы хотите центрировать содержимое ScrollPane, когда содержимое меньше, чем область просмотра. Это не так просто, как просто использовать макет, который центрирует его дочерние элементы в качестве содержимого. A ScrollPane по умолчанию только изменяет размер своего содержимого до указанного предпочтительного размера, но выравнивает содержимое по верхнему левому углу. Это означает, что контент, когда он меньше, чем область просмотра, занимает только пространство в верхнем левом углу; даже если содержимое центрирует свои собственные дочерние элементы, область содержимого не равна площади области просмотра, поэтому содержимое не центрируется в области просмотра.

Было бы неплохо, если бы ScrollPane имел "alignment" для настройки этого поведения. Поскольку такого свойства не существует, вам необходимо настроить ScrollPane для заполнения его области просмотра, а также позволить содержимому вырасти за пределы размеров области просмотра. Затем вам просто нужно использовать макет, который центрирует его дочерние элементы или может быть настроен для этого - GridPane является одним из таких макетов. Вот пример:

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Main extends Application {

  @Override
  public void start(Stage primaryStage) {
    // create and populate GridPane
    GridPane gridPane = new GridPane();
    gridPane.setHgap(10);
    gridPane.setVgap(10);
    for (int row = 0; row < 10; row++) {
      for (int col = 0; col < 10; col++) {
        Rectangle rectangle = new Rectangle(50, 50, Color.TRANSPARENT);
        rectangle.setStroke(Color.BLACK);
        gridPane.add(rectangle, col, row);
      }
    }

    /*
     * From the property's Javadoc: "The alignment of the grid within
     * the gridpane's width and height".
     *
     * Using Pos.CENTER makes the GridPane center its grid when the GridPane
     * has extra horizontal and/or vertical space.
     */
    gridPane.setAlignment(Pos.CENTER);

    /*
     * Forces the dimensions of the GridPane to be at least the same
     * as its preferred size. This prevents the GridPane from shrinking
     * due to the fit-to-width/fit-to-height configuration of the
     * ScrollPane.
     */
    gridPane.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);

    ScrollPane scrollPane = new ScrollPane(gridPane);

    /*
     * Forces the content of the ScrollPane to have the same dimensions
     * as the viewport. However, because of the min-size configuration above,
     * the GridPane can never be smaller than its preferred size. This means
     * the ScrollPane will grow its content to fit the viewport but won't
     * shrink its content to fit the viewport.
     */
    scrollPane.setFitToWidth(true);
    scrollPane.setFitToHeight(true);

    primaryStage.setScene(new Scene(scrollPane, 600, 400));
    primaryStage.show();
  }
}

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

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