假设我有一个JDialog
(称为BrushListDialog
)的专门子类,其中我有一个JList
. 该列表使用自定义列表模型(扩展DefaultListModel<String>
)和自定义单元格渲染器(扩展DefaultListCellRenderer
)。为了便于阅读,我将这些类嵌套在主类中。
通常,我会将这些类设为静态(我为单元格渲染器所做的),但列表模型类具有以下方法:
private boolean showRemoveConfirmDialog(Object elem) {
int option = JOptionPane.showConfirmDialog(BrushListDialog.this,
elem + " is a default brush type.\nDo you want to allow the removal of such entries?",
"Remove", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
if (option == JOptionPane.YES_OPTION) {
TYPES.clear();
return true;
}
return false;
}
如您所见,它依赖于顶级类的实例来确定JOptionPane
的显示位置。BrushListDialog.this
,当然,不能在静态上下文中调用,因此嵌套类不能是静态的。
我看到了三种处理方法(使用null
第一个参数 inshowConfirmDialog
不是一个选项):
- 保持单元格渲染器静态,但将列表模型设为内部类以便能够调用
BrushListDialog.this
. - 将两个嵌套类设为静态,并通过列表模型的构造函数传递当前
BrushListDialog
实例。 - 使用 Swing 实用程序方法来遍历组件并找到一个实例
BrushListDialog
(在我看来这很 hacky)。
所以我问你:为了能够访问父对话框的实例而保持列表模型非静态值得吗?