情况:我在DB中有一个非常大的表(让我们假设100000000000)。我需要在此表中显示tableview中的项目,但当然不是全部,而只需要用户需要查看的项目。例如,他对id为500000的项目感兴趣。我在tableview中显示这个项目+之前的10个项目和项目之后的+10个项目,ID为500000.如果他需要查看更多项目,那么在桌面视图上滚动鼠标滚轮,或者向上向下键,他让程序从数据库表中动态加载项目,并在tableview之前(向上移动)或之后(向下移动)项目时插入项目。
我的解决方案:为了向他展示他在滚动条上的真实位置(根据DB中的所有行),我在StackPane中创建了假滚动条并将其放在tableview滚动条上方。这是我能找到的唯一解决方案,因为tableview滚动条值是自动计算在tableview中的项目。
唯一的问题是用户可以滚动鼠标滚轮而不是在tableview上方(这种情况一切正常),但在这个假滚动条上方。为了避免困难的计算,我只想将滚动事件从这个假滚动条传递到tableview。换句话说,我希望当用户在我的滚动条上滚动鼠标滚轮时,tableview的行为就像用户在tableview上滚动鼠标滚轮一样。这是我的代码
ScrollBar scrollBar=new ScrollBar;
TableView tableView=new TableView();
...
scrollBar.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent scrollEvent) {
//we throwing this event to tableview
tableView.fireEvent(scrollEvent);
}
});
然而它不起作用。怎么做?
答案 0 :(得分:1)
如果我没弄错,您可以尝试将TableView
的内部滚动条的值绑定到自定义ScrollBar
的值。
如果您希望仅使用鼠标滚轮滚动来触发 ,请使用:
scrollBar.addEventFilter(ScrollEvent.SCROLL, new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent event) {
ScrollBar tableViewScrolllBar = (ScrollBar) tableView.lookup(".scroll-bar:vertical");
tableViewScrolllBar.setValue(scrollBar.getValue() / scrollBar.getMax());
}
});
如果您希望通过鼠标滚轮和鼠标单击滚动来触发此行为,请使用:
scrollBar.valueProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
ScrollBar tableViewScrolllBar = (ScrollBar) tableView.lookup(".scroll-bar:vertical");
tableViewScrolllBar.setValue(scrollBar.getValue() / scrollBar.getMax());
}
});
获取TableView
滚动条的功劳归于this帖子的@James_D。
我不知道你为什么要使用ScrollBar
并试图手动设置TableView
的内部滚动条的值。它似乎不是一个好习惯,因为我们被迫使用可能会发生变化的非公共API。也许考虑使用TableView#scrollTo(int index)
等公共方法或类似的方法是个好主意。
答案 1 :(得分:1)
在TableView的ScrollBar上触发事件应该可以解决问题。此外,我会消耗原始事件并触发一个重新发布的事件,如下所示:
scrollBar.addEventFilter(ScrollEvent.SCROLL, new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent event) {
event.consume();
Node target = tableScrollBar;
ScrollEvent retargettedScrollEvent = new ScrollEvent(target, target, event.getEventType(),
event.getX(), event.getY(), event.getScreenX(), event.getScreenY(), event.isShiftDown(),
event.isControlDown(), event.isAltDown(), event.isMetaDown(), event.isDirect(),
event.isInertia(), event.getDeltaX(), event.getDeltaY(), event.getTotalDeltaX(),
event.getTotalDeltaY(), event.getTextDeltaXUnits(), event.getTextDeltaX(),
event.getTextDeltaYUnits(), event.getTextDeltaY(), event.getTouchCount(),
event.getPickResult());
Event.fireEvent(target, retargettedScrollEvent);
}
});