加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

JavaFX:从Memory清理TableView实例

发布时间:2020-12-15 02:17:36 所属栏目:Java 来源:网络整理
导读:我应该如何从内存中清理TableView实例, 从我学到的, 删除附加到表的所有侦听器. (它是否适用于相应表的列和行?) 清除所有列. 和 没有对表实例的强引用. 从外部参考我做了以下, 将焦点模型设置为null. 设置鼠标,键侦听器为null. setSelectionModel为null. se
我应该如何从内存中清理TableView实例,

从我学到的,

>删除附加到表的所有侦听器. (它是否适用于相应表的列和行?)
>清除所有列.

>没有对表实例的强引用.

从外部参考我做了以下,

>将焦点模型设置为null.
>设置鼠标,键侦听器为null.
> setSelectionModel为null.
> setItems为空的ObservableArraylist.

最后,我的代码如下所示.

//I gave a try for,RowFactory and ColumnFactory to null.    
            tableView.setRowFactory(null);
            for (TableColumn column : this.tableView.getColumns()) {
                column.setCellFactory(null);
                column.setCellValueFactory(null);
            }
            tableView.getFocusModel().focus(null);
            tableView.setOnMouseClicked(null);
            tableView.setSelectionModel(null);
            tableView.getColumns().clear();
            tableView.setItems(FXCollections.observableArrayList());
            tableView = null;

我的问题是:

我打开了多个表视图,当我关闭时,(与ProfileView相关的HashMapNode(来自探查器)仍在内存中而未发布)
因此,每当我关闭tableView时,我都会调用上面的代码.

另外,我使用内部类来设置如下的setCellFactory,

column.setCellFactory((TableColumn<?,?> param) -> new EditingTableCell());

private class EditingTableCell extends TableCell<?,?> {
//.....
}

那么,我应该如何正确地清理一个TableView实例,以便它被垃圾收集.

Java Version : 1.8.0_45

JavFX Version : 8.0.45-b11

解决方法

3(没有对表实例的强引用)应该足够了.

如果没有更强的引用,则监听器是弱引用,不会阻止GC清理对象.

但是,如果TableView包含在Tab中,那么在关闭选项卡时它可能不是GC,因为JavaFX在其内部保留了对最后一个关闭选项卡的强引用(我花了一些时间才发现 – 我考虑这是一种不受欢迎的类似bug的行为).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读