ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 绑定到ScrollPane ScrollBar时的奇怪ScrollBar行为

2019-07-05 15:12:55  阅读:222  来源: 互联网

标签:java javafx javafx-8


我已经构建了一个控件,为JavaFX提供类似Twitter Bootstrap导航栏的行为.它基本上由一个StackPane组成,背面有一个ScrollPane,一个是顶部的BorderPane,另一个是顶部的条形图,最后是最顶层右侧的一个带有ScrollBar的BorderPane.
这应该支持以下场景:

>滚动时,顶部和底部的固定元素不会移动(例如导航栏)
>拥有一个位于内容之上的ScrollBar,与ScrollPanes的默认行为不同,将内容推向左侧以便为内置ScrollBar提供不动产

因此StackPane布局.

布局部分工作正常,做我想要的.我的ScrollBar表现得很奇怪.当内容可滚动时,本机ScrollBar(由ScrollPane管理的内容)如下所示:

native ScrollBar

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

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

enter image description here

ScrollBar拇指很小,尽管原生的拇指尺寸正确.要么:

enter image description here

尽管内容可滚动,但拇指具有最大尺寸.
滚动工作时,这两个例子在视觉上都是明显错误的.
我绑定两个ScrollBars属性的代码如下所示:

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);

值得一提的另一件事是,在我使用此控件的几乎所有其他地方,它的行为都正确.只有少数地区出现这种情况,但我不明白它是如何仍然存在的.

最后:我在这里失踪了什么属性?鉴于我将所有这些属性从ScrollPane ScrollBar绑定到我的自定义叠加层ScrollBar(vScrollBar),ScrollBars的行为是否应该完全相同?

解决方法:

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

我不知道你是如何创建组件的,但hiddenScrollBar很可能只是null,可见的ScrollBar永远不会被限制在ScrollPane的ScrollBar中.

发生这种情况是因为在创建ScrollPaneSkin期间但在设置属性skin之前通知了nodeListChangeListener,因此无法访问滚动条.

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

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

标签:java,javafx,javafx-8
来源: https://codeday.me/bug/20190705/1388551.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有