【问题标题】:How to get thumb value range of ScrollBar in JavaFX?如何在 JavaFX 中获取 ScrollBar 的拇指值范围?
【发布时间】:2019-03-30 00:43:45
【问题描述】:

例如,假设我们有一个滚动条,用于在某些应用程序上显示/操作数据。滚动条也有最小值、最大值和可见量。但是根据滚动条值显示的值的范围有点令人困惑。

作为一个例子,这里是一张图片

但它是根据滚动条拇指的不同边来计算的。

假设我需要显示数据库中的一些数据,最小值将是 min id,最大值也将是 max id。并考虑我想显示 100 个项目,我将在滚动条中将可见数量设置为 100。滚动时如果scoolbar 的值等于1,从数据库中获取范围就像将100(可见量)加1 一样简单,但是当值等于max 时,这将不起作用。所以这就是为什么我需要获取滚动条拇指的值范围,但是在查看滚动条源代码时我找不到这个功能的实现。

如何获取滚动条的拇指或可见值范围的最小值和最大值?

【问题讨论】:

  • visibleAmount 是拇指的长度,滚动条的值大概是拇指的中间,所以可以计算开始/结束位置
  • 如果该值为拇指的中间,那么当该值为1时,拇指的起始位置将小于零。
  • 我的意思是如何获取滚动条的可见值范围。
  • oops ... 很好,刚刚查看了 ScrollBarSkin 的来源,它将拇指宽度映射到 visibleAmount。然后你需要做额外的数学,只要值 width - amount/2)

标签: java css javafx


【解决方案1】:

ScrollBar 表示位置,而不是范围。该职位可通过value 属性获得。 visualAmount 属性决定了滑块的大小。

如果value == max 拇指位于最右边/最底部的位置。您的“拇指最大值”将超过 max

因此,您应该根据此决定显示和计算 visibleAmountmax 的项目数:

max           = itemCount - displayedItems
visibleAmount = max * displayedItems / itemCount

ScrollPane-like 实现示例:

@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();
}

【讨论】:

  • 如果可见量为200,最小值为1,最大值为10000。当滚动条值为1时,可见值从1到200,当值为10000(最大值)时,则可见值是从 9800 到 10000。如何实现这一点?您可以使用 Label 代替 HBox 与矩形。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多