Java:JTable没有正确显示图标

时间:2011-03-28 09:02:13

标签: java swing icons jtable

在我的应用程序中,我需要在JTable中显示文件系统文件。当我点击JTree节点(任何系统文件夹)时,该文件夹的内容显示在JTable中。

在JTable的第一列(显示文件或文件夹图标的名称)中,将从系统图标中获取图标并显示该图标。 一切都很好。但是,问题是当渲染器渲染图标时,所有行中都会重复第一个文件(JTable的第一行)的图标。我的意思是JTable的后续行中的图标不会改变。在这里,我的代码是一个渲染获取图标,模型在JTable中显示它

class KeyIconCellRenderer extends DefaultTableCellRenderer {
    public KeyIconCellRenderer(String ext) {
        File file = new File(ext);
        Icon icon = FileSystemView.getFileSystemView().getSystemIcon(file);
        setIcon(icon);
    }
}

这里是我使用渲染显示的代码

private class Selection implements TreeSelectionListener {
    public void valueChanged(TreeSelectionEvent e) {
        Object[] myData= new Object[6];
        TreePath path = e.getPath();
        FileUtil util= new FileUtil();
        FileMetaData metaData;

        Vector<FileMetaData> vList = new Vector<FileMetaData>();
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)treeMainView.getLastSelectedPathComponent();

        FileInfo info =(FileInfo)node.getUserObject();
        File filePath= info.getFilepath();
        vList=util.getChildList(filePath);
        dtModel.getDataVector().removeAllElements();

        for(int i=0;i<vList.size(); i++){
            Vector v= new Vector();
            metaData=(FileMetaData)vList.get(i);
            v.add(metaData.getName());
            tblMainView.getColumnModel().getColumn(0).setCellRenderer(new KeyIconCellRenderer(metaData.getClientpath()));
            v.add(metaData.getClientpath());
            if(metaData.isDirectory()){
                v.add("");
            }else
            {
                v.add((FileHelper.getSizeString(metaData.getSize())));
            }
            if(metaData.isDirectory()){
                v.add("");
            }else
            {
                v.add(new Date(metaData.getTime()));
            }
            if(metaData.isDirectory()){
                v.add("Folder");
            }else
            {
                v.add("File");
            }
            v.add("Pending Upload");

            dtModel.insertRow(0, v);
        }
        tblMainView.repaint();
    }
}

如附图所示,只有第一个文件的图标在所有行中重复,

请帮助,这将是一个巨大的帮助, 谢谢

Screen shot

1 个答案:

答案 0 :(得分:2)

[你的表面错误是在循环中重置表列的渲染器,每次都在渲染器的构造函数中对当前图标进行硬编码。因此,文件图标用于所有。

基本问题是你似乎并不完全理解renderer的概念:它在那里显示单元格数据,因为它在getXXCellRendererComponent中作为参数传递。这就是查找要使用的图标的地方。要做的是将File对象存储在表格单元格中,并在每次调用方法时查询相应的图标。

干杯 珍妮特