我已经定义了一个DirectoryListModel
类,它扩展了Java Api中的AbstractListModel
类。
在内部,我有一个File
个对象的列表。我已将getElementAt(int index)
方法定义为:
@Override
public Object getElementAt(int index) {
return directoryElements.get(index)
}
问题在于,当我尝试使用DirectoryListModel
运行JList时,它将显示文件的完整路径而不仅仅是文件名。我可以将此代码更改为:
@Override
public Object getElementAt(int index) {
return directoryElements.get(index).getName();
}
并且它会产生奇迹,但问题是在onclick事件中我会想要拥有File对象,所以我可以用它们进行一些检查(检查它们是否是目录等)。
如果我让getElementAt()
返回一个字符串,我就失去了这种可能性,因此我想知道是否有一种方法可以在JList在我的窗口中显示它们之前格式化我的File对象,或者是否有任何简单和优雅这样做的方式。
由于
答案 0 :(得分:2)
您最好的办法是使用渲染器。您可以从名称中收集的渲染器用于在V
范例中播放M
到支持数据的MVC
。在这种情况下,您的File
是后备数据,渲染器仅用于显示您要显示的File
部分。
如果您要实现自定义单元格渲染器,扩展JLabel
并实现ListCellRenderer
,您可以通过实现这样的单一接口方法开始一个简单的尝试:
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
setText(((File)value).getName());
return this;
}
请查看ListCellRenderer
javadoc获取更多指导。
答案 1 :(得分:2)
我会扩展DefaultListCellRenderer以添加您的自定义代码,原因有两个:
a)您将获得默认渲染器的默认行为,如边框,行选择突出显示...
b)渲染器(与所有Swing渲染器一样)已针对更快的绘制进行了优化。
class MyRenderer extends DefaultListCellRenderer
{
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{
Component c = super.getListCellRendererComponent(list,value,index,false,false) ;
JLabel label = (JLabel)c;
label.setText(...);
return c ;
}
}
阅读How to Use Lists上Swing教程中的部分,了解有关渲染器的更多信息。