JavaFX - ListView ScrollBar EventFilter和scrollToTop

时间:2014-01-31 09:18:01

标签: listview events javafx scrollbar

我的CustomList中有一个EventFilter来强制选择而不是滚动,并且需要在listView加载后将ScrollBar放在顶部。但是当加载后执行scrollToTop方法时,ScrollBar不再移动并保持在顶部。

EventFilter:

private final EventHandler<ScrollEvent> scrollEventFilter = new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent t) {
    if (t.getDeltaY() < 0) {
        getSelectionModel().selectNext();
    } else {
        getSelectionModel().selectPrevious();
    }

    t.consume();
  }
};

scrollToTop方法:

public void scrollToTop() {
  Node n = lookup(".scroll-bar");
  if (n instanceof ScrollBar) {
    final ScrollBar bar = (ScrollBar) n;
    if (bar.getOrientation().equals(Orientation.VERTICAL)) {
        bar.setValue(0.5);
    }
  }
}

我该如何解决?

由于

1 个答案:

答案 0 :(得分:1)

根据您的部分代码;

1)由于滚动条的默认最大值和最小值分别为1.0和0.0,因此scrollToTop方法不会滚动到顶部。因为您将滚动条的值设置为0.5,这意味着加载ListView的“滚动到中心”。

2)附加eventHandler后,滚动条将不再移动,因为事件处理程序使用了ScrollEvent。 scrollBar不会通过鼠标滚轮移动,但会通过鼠标拖动滚动。

3)我建议使用ListView.scrollTo()方法:

private final EventHandler<ScrollEvent> scrollEventFilter = new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent t) {
    if (t.getDeltaY() < 0) {
        getSelectionModel().selectNext();
    } else {
        getSelectionModel().selectPrevious();
    }

    scrollTo(lst.getSelectionModel().getSelectedIndex());

    t.consume();
  }

};