JavaFX自定义滚动条在滚动时将事件传递给TableView

JavaFX自定义滚动条在滚动时将事件传递给TableView,java,javafx,Java,Javafx,情况:我有一个非常大的表,单位为DB(假设为10000000000)。我需要在tableview中显示这个表中的项目,但当然不是所有项目,而是用户需要看到的项目。例如,他对id为500000的项目感兴趣。我在tableview中向他显示此项,在id为500000的项之前+10项,之后+10项。若他需要查看更多内容,那个么通过在tableview上滚动鼠标滚轮或上下键,他可以让程序动态地从数据库表加载项,并在tableview中的项之前(上移时)或之后(下移时)插入项 我的解决方案:为了显示他在滚

情况:我有一个非常大的表,单位为DB(假设为10000000000)。我需要在tableview中显示这个表中的项目,但当然不是所有项目,而是用户需要看到的项目。例如,他对id为500000的项目感兴趣。我在tableview中向他显示此项,在id为500000的项之前+10项,之后+10项。若他需要查看更多内容,那个么通过在tableview上滚动鼠标滚轮或上下键,他可以让程序动态地从数据库表加载项,并在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);
   }
});
ScrollBar ScrollBar=新的滚动条;
TableView TableView=新建TableView();
...
scrollBar.addEventFilter(ScrollEvent.ANY,new EventHandler()){
@凌驾
公共无效句柄(ScrollEvent ScrollEvent){
//我们将此事件提交给tableview
tableView.fireEvent(scrollEvent);
}
});

但是,它不起作用。如何操作?

如果我没记错的话,您正在尝试将
TableView
的内部滚动条的值绑定到自定义
滚动条的值

如果希望仅通过使用鼠标滚轮滚动来触发此行为,请使用:

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.addEventFilter(ScrollEvent.SCROLL,new EventHandler()){
@凌驾
公共无效句柄(ScrollEvent事件){
滚动条tableView滚动条=(滚动条)tableView.lookup(“.ScrollBar:vertical”);
TableViewScrollBar.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());
    }
});
scrollBar.valueProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(ObservalEvalue在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);
            }
        });
scrollBar.addEventFilter(ScrollEvent.SCROLL,new EventHandler()){
@凌驾
公共无效句柄(ScrollEvent事件){
event.consume();
节点目标=tableScrollBar;
ScrollEvent RetargetedScrollEvent=新的ScrollEvent(目标,目标,事件。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,
event.getTotalDeltaY(),event.getTextDeltaXUnits(),event.getTextDeltaX(),
event.getTextDeltaYUnits(),event.getTextDeltaY(),event.getTouchCount(),
event.getPickResult());
Event.fireEvent(目标,重定目标ScrollEvent);
}
});

非常感谢您的解决方案!这就是我需要的。我等了这么久……您可以手动设置假滚动条上的位置,就像您必须根据数据库中的行数设置其最小值和最大值一样。我会在代码中插入新数据到表中的相同位置执行此操作(如果可行).