我在徘徊,是否有一个属性,我可以附加一个监听器,代表“当列表视图开始显示ScrollBar时”的操作?
问题是,我有一个输出到ListView,并在某些时候ListView的scrollBar触发器。我想捕获该事件并滚动到底部,因此ListView对象的下一个添加将自动滚动到底部。
我确实理解我可以使用侦听器进行项目更改,但我想在我决定向上滚动时保留该行为,并且一旦添加项目它就不会滚动回到最后一个位置。
答案 0 :(得分:1)
也许这可以帮到你:
private boolean scroll = true;
private ListView<String> listView = new ListView<>();
Constructor(){
outputListView.addEventFilter(ScrollEvent.ANY, (e) ->{ //get every scroll event
if(e.getTextDeltaY() > 0){ //set Scroll event to false when the user scrolls up
scroll = false;
}
});
}
public void addToListView(String s){
listView.getItems().add(s);
if(scroll)
listView.scrollTo(listView.getItems().size() -1 );
}
在这种情况下,listView会在显示滚动条时向下滚动,但当用户向上滚动时,listView不再向下滚动,直到用户在Listview底部滚动(这是一个标准的列表视图行为)< / p>
答案 1 :(得分:1)
试试这个:
for (Node node : listView.lookupAll(".scroll-bar")) {
if (node instanceof ScrollBar) {
ScrollBar scrollBar = (ScrollBar) node;
scrollBar.visibleProperty().addListener((observable, oldValue, newValue) -> {
System.out.println(String.format("%s ScrollBar Visible Property Changed From: %s To: %s", scrollBar.getOrientation(), oldValue, newValue));
});
}
}
<强>输出:强>
VERTICAL ScrollBar可见属性已更改自:false To:true
注意:在ListView
中设置项目以避免NullPointerException
答案 2 :(得分:-1)
就我个人而言,我并不热衷于 CSS 查找方法,因为对我来说这太像一种黑客攻击(我不喜欢依赖硬编码的属性查找)。
我喜欢做的只是在物理布局树中搜索具有正确方向的滚动条:
public static Optional<ScrollBar> getScrollbar(Node n, Orientation o) {
LinkedList<Node> queue = new LinkedList<>();
queue.add(n);
while(! queue.isEmpty()) {
n = queue.removeFirst();
if (n instanceof ScrollBar) {
ScrollBar sb = (ScrollBar)n;
if (sb.getOrientation() == o) {
return Optional.of(sb);
}
}
if (n instanceof Parent) {
queue.addAll(((Parent) n).getChildrenUnmodifiable());
}
}
return Optional.empty();
}
例如,如果我将一个浮动按钮锚定在列表视图的右上角,当列表视图的布局边界属性发生变化时,我会这样做:
Optional<ScrollBar> sb = getScrollbar(listView, Orientation.VERTICAL);
if (sb.isPresent() && sb.get().isVisible()) {
StackPane.setMargin(hoverButton, new Insets(1, sb.get().getWidth(), 0, 0));
}
else {
StackPane.setMargin(hoverButton, new Insets(1, 1, 0, 0));
}
这会将我的按钮滑过,这样它就不会悬停在滚动条上。