2011-03-28 89 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對象存儲在表格單元格中,並在每次調用該方法時查詢適當的圖標。

乾杯 珍