情况:我在数据库中有一个非常大的表(假设 100000000000)。我需要在此表中的 TableView 中显示项目,但当然不是全部,而只是用户需要查看的项目。例如,他对 id 为 500000 的项目感兴趣。我在 tableview 中向他显示此项目 + id 为 500000 的项目之前的 10 个项目和之后的 +10 个项目。如果他需要查看更多,则通过在 tableview 上滚动鼠标滚轮,或者向上和向上滚动他使程序动态地从数据库表中加载项目并在 TableView 中的项目之前(向上移动时)或之后(向下移动时)插入项目。
我的解决方案:为了向他显示他在滚动条上的真实位置(根据数据库中的所有行),我在 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);
}
});
但是它不起作用。怎么做?
最佳答案
在 TableView 的滚动条上触发事件应该可以解决问题。此外,我会使用原始事件并触发重定向事件,如下所示:
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);
}
});
关于JavaFX 自定义 ScrollBar 在滚动时将事件传递给 TableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41550371/