首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定到ScrollPane ScrollBar时奇怪的ScrollPane行为

绑定到ScrollPane ScrollBar时奇怪的ScrollPane行为
EN

Stack Overflow用户
提问于 2018-05-23 14:47:19
回答 1查看 368关注 0票数 4

我已经构建了一个控件,它为JavaFX提供了类似Twitter引导导航条的行为。它基本上包括一个StackPane,背面有一个ScrollPane,一个顶部有一个BorderPane,顶部有一个底部条,最后是一个在最上面层右边有一个ScrollBar的BorderPane。这应该支持以下情况:

  • 在顶部和底部有固定的元素,当滚动时不会移动( la navbar)
  • 在内容之上有一个ScrollBar,与ScrollPanes的默认行为不同,它将内容推到左边,以便为内置ScrollBar提供房地产。

因此产生了StackPane布局。

布局部分工作得很好,可以做我想做的事。不过,我的ScrollBar表现得很奇怪。当内容可滚动时,本机ScrollBar (由ScrollPane管理的)如下所示:

红线表示对拇指最大尺寸的估计。因此,对于可滚动的内容,ScrollBar并不是尽可能高--这是正确的。

现在,我的实现与可滚动内容的行为有所不同。我可以观察到两种行为:

ScrollBar拇指很小,尽管本地拇指的大小是正确的。或者:

拇指有最大的大小,即使内容是可滚动的。虽然滚动的工作,这两个例子显然是错误的视觉效果。绑定两个ScrollBars属性的代码如下所示:

代码语言:javascript
复制
vScrollBar.valueProperty().bindBidirectional(scrollPane.vvalueProperty());
vScrollBar.maxProperty().bind(scrollPane.vmaxProperty());
vScrollBar.minProperty().bind(scrollPane.vminProperty());
nodeListChangeListener = c -> {
    ScrollBar hiddenScrollBar = getScrollBarFromScrollPane(scrollPane, Orientation.VERTICAL);
    if (hiddenScrollBar != null) {
        vScrollBar.visibleAmountProperty().bind(hiddenScrollBar.visibleAmountProperty());
        vScrollBar.blockIncrementProperty().bind(hiddenScrollBar.blockIncrementProperty());
        vScrollBar.unitIncrementProperty().bind(hiddenScrollBar.unitIncrementProperty());
        scrollPane.getChildrenUnmodifiable().removeListener(nodeListChangeListener);
    }
};
scrollPane.getChildrenUnmodifiable().addListener(nodeListChangeListener);

另外值得一提的是,在我使用该控件的几乎所有其他地方,它的行为都是正确的。只有少数几个领域会发生这种情况,但我不明白这怎么可能。

最后:,我在这里失去了什么财产?考虑到我将所有这些属性从(**vScrollBar**)? ScrollPane ScrollBar绑定到自定义覆盖ScrollBar ScrollBar,这两个ScrollBars的行为不应该相同吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-28 18:10:51

(我假设getScrollBarFromScrollPane(scrollPane, Orientation.VERTICAL);调用(ScrollBar)scrollPane.queryAccessibleAttribute(AccessibleAttribute.VERTICAL_SCROLLBAR);)

我不知道您是如何创建组件的,但是很可能hiddenScrollBar只是null,可见ScrollBar从来没有被限制在ScrollPane的ScrollBar上。

之所以会发生这种情况,是因为在创建nodeListChangeListener期间通知了ScrollPaneSkin,但在设置属性skin之前,因此不可能访问滚动条。

要正确绑定滚动条,可以向skinProperty添加侦听器

代码语言:javascript
复制
scrollPane.skinProperty().addListener(c -> {
    ScrollBar hiddenScrollBar = (ScrollBar)scrollPane.queryAccessibleAttribute(AccessibleAttribute.VERTICAL_SCROLLBAR);
    if (hiddenScrollBar != null) {
        bar.visibleAmountProperty().bind(hiddenScrollBar.visibleAmountProperty());
        bar.blockIncrementProperty().bind(hiddenScrollBar.blockIncrementProperty());
        bar.unitIncrementProperty().bind(hiddenScrollBar.unitIncrementProperty());
    }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50491389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档