滚动显示JavaFX ListView

时间:2018-03-22 10:12:15

标签: java listview javafx scrollbar

我在徘徊,是否有一个属性,我可以附加一个监听器,代表“当列表视图开始显示ScrollBar时”的操作?

问题是,我有一个输出到ListView,并在某些时候ListView的scrollBar触发器。我想捕获该事件并滚动到底部,因此ListView对象的下一个添加将自动滚动到底部。

我确实理解我可以使用侦听器进行项目更改,但我想在我决定向上滚动时保留该行为,并且一旦添加项目它就不会滚动回到最后一个位置。

3 个答案:

答案 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));
    }

这会将我的按钮滑过,这样它就不会悬停在滚动条上。