在我的应用程序中,我需要在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();
}
}
如附图所示,只有第一个文件的图标在所有行中重复,
请帮助,这将是一个巨大的帮助, 谢谢
答案 0 :(得分:2)
[你的表面错误是在循环中重置表列的渲染器,每次都在渲染器的构造函数中对当前图标进行硬编码。因此,文件图标用于所有。
基本问题是你似乎并不完全理解renderer的概念:它在那里显示单元格数据,因为它在getXXCellRendererComponent中作为参数传递。这就是查找要使用的图标的地方。要做的是将File对象存储在表格单元格中,并在每次调用方法时查询相应的图标。
干杯 珍妮特