【问题标题】:Java: JTable not showing icons properlyJava:JTable 未正确显示图标
【发布时间】: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 来自哪里?)。

标签: java swing icons jtable


【解决方案1】:

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

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

干杯 珍妮特

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多