【发布时间】:2011-03-28 09:02:12
【问题描述】:
在我的应用程序中,我需要在 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();
}
}
如附图所示,只有第一个文件的图标在所有行中重复,
请帮忙,这将是一个巨大的帮助, 谢谢
【问题讨论】:
-
仅供参考:当您在 Internet 上交叉发布问题时,请记住检查问题的措辞以确保它仍然有意义。您参考了附加图像(我没有看到)。我想您指的是在 Code Ranch (coderanch.com/t/532283/GUI/java/JTable-Cell-Rendere-Not-showing) 上附加到您的问题的图片?
-
我附上了你在 Code Ranch 使用的图片。
-
您能否发布此问题的简单有效示例的完整代码(以便我们可以在我们的计算机上进行尝试)?似乎缺少代码(例如,
dtModel来自哪里?)。