Java: JTable неправильно отображает значки - PullRequest
1 голос
/ 28 марта 2011

В моем приложении мне нужно отобразить файлы файловой системы в 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();
    }
}

как на прикрепленном изображении, только значок первого файла повторяется во всех строках,

Пожалуйста, помогите, это будет огромное одолжение, Спасибо

Screen shot

1 Ответ

2 голосов
/ 28 марта 2011

[Ваша поверхностная ошибка - сбросить рендерер столбца таблицы в цикле, каждый раз жестко кодируя текущий значок в конструкторе рендерера. Следовательно, значок файла используется для всех.

Основная проблема заключается в том, что вы, похоже, не совсем понимаете концепцию рендерера : он предназначен для отображения данных ячейки в том виде, в каком они передаются в качестве параметра в свой getXXCellRendererComponent. Так что это место для поиска иконки для использования. Для этого нужно сохранить объект File в ячейке таблицы и запрашивать соответствующий значок при каждом вызове метода.

Приветствие Жанетт

...