2011-03-28 93 views
1

在我的应用程序中,我需要在JTable中显示文件系统文件。当我点击JTree节点(这是任何系统文件夹)时,该文件夹的内容显示在JTable中。Java: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

FYI:当你交叉张贴问题,在互联网上,记得要检查你的问题的措辞,以确保它仍然是有意义的。你参考一个附加的图像(我没有看到一个)。我推测你是在Code Ranch(http://www.coderanch.com/t/532283/GUI/java/JTable-Cell-Rendere-Not-showing)中提到你的问题的图片? – 2011-03-28 09:23:57

+0

我附上了您在Code Ranch使用的图像。 – 2011-03-28 09:25:42

+0

你可以发布一个简单的,这个问题的工作示例的完整代码(所以他们我们可以在我们的电脑上试用它)?似乎缺少代码(例如,dtModel从哪里来?)。 – 2011-03-28 09:38:04

回答

2

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

基本问题是,您似乎完全不了解renderer的概念:它显示的是单元数据,因为它在getXXCellRendererComponent中作为参数提供。所以这是查找要使用的图标的地方。要走的路是将File对象存储在表格单元格中,并在每次调用该方法时查询适当的图标。

干杯 珍