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

标签 java javafx

情况:我在数据库中有一个非常大的表(假设 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/

相关文章:

将 CSV 导入 Access 的 Java 代码

java - 解析 java.nio.files.Path 时忽略前导斜杠的最佳方法是什么

css - 如何使用 CSS 在场景生成器中附加自定义字体?

java - 如何使用 Hibernate 将数据流式传输到数据库 BLOB(字节 [] 中没有内存存储)

java - jdbc无法通过端口转发连接到nat后面的mysql

java - 如何在 ZK ui 中显示 ArrayList?

javafx - 在 Controller 内加载 FXML 文件,但也使用 NetBeans 的 "Make Controller"

java - 如何将 JavaFx 应用程序连接到指纹扫描仪

JavaFX 参数化可编辑表格 View

java - 为什么 thread.sleep 会使我的 JavaFX 应用程序崩溃?