ScrollBar
указывает позицию, а не диапазон.Позиция доступна через свойство value
.Свойство visualAmount
определяет размер ползунка.
Если value == max
, большой палец находится в крайнем правом / нижнем положении.Ваше «максимальное значение большого пальца» будет превышать max
.
Поэтому вы должны решить, сколько элементов отобразить и рассчитать visibleAmount
и max
, исходя из этого:
max = itemCount - displayedItems
visibleAmount = max * displayedItems / itemCount
Пример для ScrollPane
-подобной реализации:
@Override
public void start(Stage stage) {
ScrollBar scrollBar = new ScrollBar();
scrollBar.setOrientation(Orientation.VERTICAL);
StackPane.setAlignment(scrollBar, Pos.CENTER_RIGHT);
VBox container = new VBox();
StackPane.setAlignment(container, Pos.TOP_LEFT);
StackPane root = new StackPane(container, scrollBar);
InvalidationListener listener = o -> {
// adjust scrollbar properties on resize of root or content
double rootHeight = root.getHeight();
double contentHeight = container.getHeight();
double max = Math.max(0, contentHeight - rootHeight);
scrollBar.setMax(max);
scrollBar.setVisibleAmount(max * rootHeight / contentHeight);
};
root.heightProperty().addListener(listener);
container.heightProperty().addListener(listener);
// move container up based on the scrollbar value
container.translateYProperty().bind(scrollBar.valueProperty().negate());
// generate some content
for (int i = 0; i < 10; i++) {
Rectangle rect = new Rectangle(100, 100, (i & 1) == 0 ? Color.BLACK : Color.LIGHTGRAY);
container.getChildren().add(rect);
}
Scene scene = new Scene(root, 300, 300);
stage.setScene(scene);
stage.show();
}