JavaFx 13 - TableView 垂直滚动条处理程序返回 NullPointerException

Posted

技术标签:

【中文标题】JavaFx 13 - TableView 垂直滚动条处理程序返回 NullPointerException【英文标题】:JavaFx 13 - TableView Vertical ScrollBar handler returns NullPointerException 【发布时间】:2020-04-24 08:38:39 【问题描述】:

我需要处理 JavaFx13 滚动到底部事件,但是这段代码:

   @Override
   public void initialize(URL location, ResourceBundle resources) 
     // ...
     // ScrollBar verticalBar = (ScrollBar) this.emailsTable.lookupAll(".scroll-bar");
        ScrollBar verticalBar = (ScrollBar) this.emailsTable.lookup(".scroll-bar:vertical");
        verticalBar.valueProperty().addListener((obs, oldValue, newValue) ->  // <-- Line 49
             // if (verticalBar.getOrientation() != Orientation.VERTICAL) return;
            if (newValue.doubleValue() >= verticalBar.getMax()) 
                System.out.println("BOTTOM!");
            
        );
     // ...
   

...在 FXML 加载时返回该错误:

Caused by: java.lang.NullPointerException
at it.unito.prog.views.MainView.initialize(MainView.java:49)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2573)
... 19 more

【问题讨论】:

注释代码也产生相同的异常(...略有不同) 您的verticalBar 对象为空,因为this.emailsTable.lookup(".scroll-bar:vertical"); 返回null 在调用 initialize 时并非所有内容都已初始化。在实际显示场景后尝试访问该属性。 【参考方案1】:

您可以使用tableView.scrollTo() 滚动到索引或特定项目。

要获得滚动发生的通知,您可以使用tableView.setOnScrollTo()

不要为此任务使用查找

滚动条仅在需要时显示。当您查找它时,它可能存在也可能不存在。

如果您在将项目添加到表格视图之前,或者在将表格视图添加到场景之前,或者在场景经历渲染传递之前尝试lookup()滚动条,滚动条几乎肯定会不在。如果在您尝试查找时滚动条不存在,则查找方法将返回一个空值(您所看到的就是该值)。即使您第一次查找时滚动条就在那里,但随后可能会被删除并根据需要添加一个新的,因此您的原始参考最终将变得无效。所以我不推荐你的基于查找的方法。

【讨论】:

一般来说,以后不要依赖查找检索到的任何内容的好建议是相同的。但实际上,在 VirtualFlow 的核心实现中,滚动条在实例化时创建一次。显然,没有什么可依赖的 :) 它在 OP 上下文中为 null 的原因是未安装表的皮肤,因为表尚未添加到场景图中(在初始化中)

以上是关于JavaFx 13 - TableView 垂直滚动条处理程序返回 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JavaFX 垂直堆叠下载窗格?

JavaFX ComboBox OnChangeListener 回滚更改

无法将值插入 tableview - JavaFx

JAVAFX的TableView基本用法

JAVAFX的TableView基本用法

JavaFX 9/10 不再可能覆盖 TableView.resizeColumnToFitContent