Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何删除单元格工厂引用_Java_Javafx_Callback_Tablecellrenderer - Fatal编程技术网

Java 如何删除单元格工厂引用

Java 如何删除单元格工厂引用,java,javafx,callback,tablecellrenderer,Java,Javafx,Callback,Tablecellrenderer,我有一个JavaFx应用程序,它允许打开分离的窗口。分离的窗口是从fxml文件加载的。在fxml中有一个包含列的表。当窗口关闭时(阶段关闭相当于阶段隐藏),我的窗口控制器对象仍然处于活动状态,因为一些回调引用与表单元格关联。 回调与单元格的关联方式如下: colImage.cellFactoryProperty().set(null); @FXML 私有表列colImage; // ... colImage.setCellFactory(新回调(){ @凌驾 公用电话( 最终表格(btn

我有一个JavaFx应用程序,它允许打开分离的窗口。分离的窗口是从fxml文件加载的。在fxml中有一个包含列的表。当窗口关闭时(阶段关闭相当于阶段隐藏),我的窗口控制器对象仍然处于活动状态,因为一些回调引用与表单元格关联。 回调与单元格的关联方式如下:

colImage.cellFactoryProperty().set(null);
@FXML
私有表列colImage;
// ...   
colImage.setCellFactory(新回调(){
@凌驾
公用电话(
最终表格(btnCol){
最终TableCell单元格=新TableCell(){
@凌驾
public void updateItem(最终布尔值确认,
最终布尔值(空){
super.updateItem(确认,空);
如果(确认!=null){
如果(确认){
最终图像视图colIconNew=buildIconImageView(
图标(已选中,请查阅);
setGraphic(colIconNew);
}否则{
设置图形(空);
}
}否则{
设置图形(空);
}
}
};
单元设置对齐(位置中心);
返回单元;
}
});
有没有办法在窗口关闭操作后删除这些引用?在发生如下关闭操作后,我尝试设置空回调:

colImage.cellFactoryProperty().set(null);
但它不起作用。 有什么想法吗


非常感谢。

您认为为什么会保留对控制器的引用?一旦表没有活动引用,那么它的列大概就没有活动引用了。问题的实际症状是什么?我用jvisualm监视应用程序实例,并且在阶段关闭后控制器仍然处于活动状态。注释上述代码行(以便使用默认渲染器)使其正常,控制器实例消失。但我需要一个如上所述的自定义渲染器。不确定这是否修复了它(实际上我不确定是否真的存在问题),但无论如何,您都应该这样做:每次调用
updateItem(…)
方法时,您都要创建一个新的
ImageView
。您应该为单元格创建一个,并在
updateItem
方法中重新配置它(如果需要)。例如,将
final ImageView colIconNew=…
移动到
updateItem()
方法之外。按照您的建议,即使不需要,我也会创建它!表格只填写一次,没有任何其他更新。无论如何,请相信我,问题在于回调中保留了单元格引用,即使该表不再可见。通过注释这些行,一切都变好了。
updateItem(…)
在表格中滚动时被多次调用。因此,您可能会创建数百个
ImageView
s并立即丢弃它们。如果需要,可以延迟初始化,但每个单元格最多只能创建一个图像视图。当你扔掉像这样大量的内存使用时,担心垃圾收集单元似乎有点不合时宜。