使用JLists和ListModels

时间:2010-05-12 23:48:14

标签: java swing jlist

我已经定义了一个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对象,或者是否有任何简单优雅这样做的方式。

由于

2 个答案:

答案 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教程中的部分,了解有关渲染器的更多信息。