Как я могу создать Jtable со всеми файлами из каталога и подкаталога на Java - PullRequest
0 голосов
/ 23 марта 2019

У меня есть этот код, поэтому моя проблема заключается в том, что в jtable я должен представить все найденные файлы, в jtable столбцы - это первое имя файла, второй столбец - rute или direction и третий - дата файл. Мне нужно создать ArrayList в Java, где я сохраняю все файлы, которые были найдены

это код:

    for(int i =0; i < diret.length;i++){ 
        for(int j =0; j < diret.length;j++){
            File f = new File(dire.getAbsolutePath(),diret[j]);
           if(f.isDirectory()){
               String nombreSub[] = f.list();
               tamanio = nombreSub.length;
               for(int z =0; z < nombreSub.length;z++){
                   n1.add(nombreSub[z]);
                   n2.add(f.getAbsolutePath());
                   n3.add(date.format(f.lastModified()));
               }
           }
        }

    }


    for( int i =0; i < tamanio+diret.length;i++){
        documento nFile = new documento((String)n1.get(i),(String)n2.get(i),(String)n3.get(i));

        doc.add(nFile);
    }

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Очень элементарное решение того, что вы спрашиваете, заключается в следующем. Это эффективно создаст новый JTable, перечисляющий все файлы с верхнего уровня в подкаталоги с указанным путем.

public class FileTest {

    public static void main(String... args) {
        var frame = new JFrame();
        var table = new JTable(new FileTestModel(getFiles("D:\\test")));
        frame.setLayout(new BorderLayout());
        frame.add(new JScrollPane(table), BorderLayout.CENTER);
        frame.add(table.getTableHeader(), BorderLayout.NORTH);
        frame.setVisible(true);
        frame.setSize(300, 300);
    }

    private static List<FileContent> getFiles(String directory) {
        List<FileContent> list = new ArrayList<>();
        try (var pathStream = Files.walk(Paths.get(directory))) {
            list = pathStream
              .filter(Files::isRegularFile)
              .map(Path::toFile)
              .map(file -> new FileContent(file.getName(), file.getAbsolutePath(), new Date(file.lastModified())))
             .collect(Collectors.toList());
        } catch (IOException e) {
            System.err.println("An error has occurred:: " + e.getMessage());
        }
        return list;
    }

    private static final class FileTestModel extends AbstractTableModel {

        private static final String[] COLUMNS = { "File Name", "Root Path", "File Date" };

        private final List<FileContent> contents;

        FileTestModel(List<FileContent> contents) {
            this.contents = contents;
        }

        @Override
        public int getRowCount() { return contents.size(); }

        @Override
        public int getColumnCount() { return COLUMNS.length; }

        @Override
        public String getColumnName(int column) {
            return COLUMNS[column];
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            switch (columnIndex) {
            case 0:
                return contents.get(rowIndex).getFileName();
            case 1:
                return contents.get(rowIndex).getRootPath();
            case 2:
                return contents.get(rowIndex).getFileDate();
        }
        return null;
    }

    }

    private static final class FileContent {

        private final String fileName;
        String getFileName() { return fileName; }

        private final String rootPath;
        String getRootPath() { return rootPath; }

        private final Date fileDate;
        Date getFileDate() { return fileDate; }

        FileContent(String fileName, String rootPath, Date fileDate) {
            this.fileName = fileName;
            this.rootPath = rootPath;
            this.fileDate = fileDate;
        }

    }

}

При этом вы идете по заданному каталогу, извлекая все обычные файлы, сопоставляя их с объектом File, а затем сопоставляя их с промежуточным объектом FileContent. Когда действие поиска выполнено, результаты отображаются с использованием очень простого JTable.

Вы можете использовать этот пример для руководства. В идеале, я хотел бы, чтобы действие извлечения файла выполнялось в отдельном потоке, чтобы избежать отставания при выводе большого каталога (поскольку это блокирующее действие), и я бы хотел, чтобы загрузчик отображался в таблице jtable, но для целей этот пример это сделало бы.

0 голосов
/ 23 марта 2019

Мне кажется, что у вас проблема в том, что количество найденных файлов может быть больше:

tamanio+diret.length

Как бы я подошел к этой проблеме, чтобы установить счетчик, который я установилдо 0 в начале этого кода, затем увеличивается на единицу в условии:

if(f.isDirectory())

.Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...