我正在设计一个 JavaFX 应用程序。我已决定加载用于动态收集用户输入(来自 FXML)以响应用户事件(例如单击按钮)的对话框表单/窗口,然后在用户完成时“卸载”窗口形成并驳回它。
加载每个 FXML 表单后,在向用户显示对话框之前,需要初始化列表视图、表格视图和组合框。这是我为此目的使用的一些代码:
@FXML // This method is called by the FXMLLoader when
//initialization is complete
void initialize() {
// Initialize your logic here: all @FXML variables will have been injected
ObservableList<Institution> ilist = Institution.getInstitutionList();
Callback<ListView<Institution>, ListCell<Institution>> cellfactory =
new Callback<ListView<Institution>, ListCell<Institution>>() {
@Override
public ListCell<Institution> call(ListView<Institution> p) {
return new InstitutionListCell();
}
};
cbxInst.setCellFactory(cellfactory);
cbxInst.setButtonCell(cellfactory.call(null));
cbxInst.setPromptText(CensusAssistant.RES_STRING_INSTSELECT);
cbxInst.setItems(ilist);
cbxInst.setDisable((ilist.size() < 1));
Callback<ListView<Rotation>, ListCell<Rotation>> rotfactory =
new Callback<ListView<Rotation>, ListCell<Rotation>>() {
@Override
public ListCell<Rotation> call(ListView<Rotation> p) {
return new EncRotationListCell();
}
};
:
:
我不想显示所有代码。这里的重点是,对于我的表单上使用 Cell 子类(ListCell 等)的每个控件,我都使用匿名内部类来提供单元工厂。
这些匿名内部类将持有对其封闭类的引用。我的结论是,这些引用将防止表单在用户关闭表单后的任何时候被垃圾收集。那么,我担心如果在会话中多次打开和关闭表单,则会出现内存泄漏问题。
我在这方面有目标吗?当用户关闭表单时,我是否需要编写将单元工厂与控件分离的代码?一般来说,这是事件侦听器(或通常通过使用内部类解决的任何问题)的问题吗?在释放对象之前始终取消注册事件或操作处理程序是否明智?
编辑:
这篇文章中已经处理了许多相同的问题:使用(匿名)内部类究竟什么时候可以安全泄漏?.
我想我倾向于相信,在这种情况下,窗口可能会被反复构造和关闭,我需要尝试消除对 JavaFX 控制器类的任何潜在的长期引用;尤其是细胞工厂。