1

我已经定义了一个从 Java ApiDirectoryListModel扩展类的类。AbstractListModel

在内部,我有一个File对象列表。我已将getElementAt(int index)方法定义为:

@Override
public Object getElementAt(int index) {
    return directoryElements.get(index)
}

问题是,当我尝试使用 my 运行 JList 时DirectoryListModel,它将显示文件的完整路径,而不仅仅是文件名。我可以将此代码更改为:

@Override
public Object getElementAt(int index) {
    return directoryElements.get(index).getName();

}

它会产生奇迹,但问题是在 onclick 事件中我想要拥有 File 对象,以便我可以对它们进行一些检查(检查它们是否是目录等)。如果我getElementAt()返回一个字符串,我将失去这种可能性,因此我想知道是否有一种方法可以在 JList 在我的窗口中显示它们之前格式化我的文件对象,或者是否有任何简单优雅的方式这样做。

谢谢

4

2 回答 2

2

你最好的办法是使用渲染器。渲染器,正如您可以从名称中收集的那样,用于播放范例中V的支持数据。在这种情况下,您是支持数据,而渲染器仅用于显示您想要显示的部分。MMVCFileFile

如果您要实现自定义单元格渲染器,扩展 aJLabel并实现ListCellRenderer,您可以从一个简单的尝试开始,通过实现一个接口方法,如下所示:

 public Component getListCellRendererComponent(JList list,
                                               Object value,
                                               int index,
                                               boolean isSelected,
                                               boolean cellHasFocus) {

     setText(((File)value).getName());
     return this;
 }

查看ListCellRendererjavadoc 以获得更多指导。

于 2010-05-13T00:18:03.487 回答
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 ;
    }
}

阅读 Swing 教程中有关如何使用列表的部分,以获取有关渲染器的更多信息。

于 2010-05-13T03:47:46.337 回答