Ищем файлы в одном классе и выводим / прогрессбар в другом - PullRequest
0 голосов
/ 17 февраля 2019

Первая проблема, с которой я сталкиваюсь - это достигнуть размера моего списка, в MainWindow, когда я вызываю свой класс getResult (). Size (), он равен нулю, даже если он увеличивается в классе filesearch (если вы распечатываете его)во время поиска).

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

Я обнаружил, что мне нужно что-то сделать с SwingPropertyChangeSupport, но я не смог его реализовать.

Я попытался создать два свинг-работника в каждом классе, один для вывода в MainWindow, а другой для поиска (расширение класса FileSearch)

И поскольку я рекурсивно ищу файлы, я не уверен, что это правильный путьчтобы сделать это

  if (temp.isDirectory()) {
        new FileSearch(getFileNameToSearch(),temp).execute();
}  

эта вещь ^

public class FileSearch extends SwingWorker<Integer, String> {

private String fileNameToSearch;
private List<String> result;
private File file;

public FileSearch(String fileNameToSearch, File file) {
    this.fileNameToSearch = fileNameToSearch;
    this.file = file;
    result = new ArrayList<>();
}

public String getFileNameToSearch() {
    return fileNameToSearch;
}


public List<String> getResult() {
    return result;
}


@Override
protected Integer doInBackground() throws Exception {
    if (file.isDirectory()) {
        System.out.println("Searching directory ... " + file.getAbsoluteFile());

        if (file.canRead()) {
            try{
                for (File temp : file.listFiles()) {
                    if (temp.isDirectory()) {
                        new FileSearch(getFileNameToSearch(),temp).execute();
                    } else {
                        String temp2 = temp.getName().toLowerCase();
                        String trimmedName = temp.getName().toLowerCase();
                        try{
                            trimmedName = temp2.substring(0, temp2.lastIndexOf("."));
                        }catch(StringIndexOutOfBoundsException e){

                        }
                        if (getFileNameToSearch().equals(trimmedName)) {
                            result.add(temp.getAbsoluteFile().toString());
                            System.out.println(result.size());

                        }else{
                            System.out.println(getFileNameToSearch() + "!= " + trimmedName);
                        }

                    }
                }
            }catch(NullPointerException e){

            }


        } else {
            System.out.println(file.getAbsoluteFile() + "Permission Denied");
        }
    }
    return result.size();
}

и MainWindow

    public class MainWindow extends JFrame {
    public MainWindow() {
    initComponents();
    fileChooser1.setApproveButtonText("Select");
    fileChooser1.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    directoriesTextArea.setEditable(false);

}

private void startButtonMouseClicked(MouseEvent e) {
    directoriesTextArea.setText("");

    SwingWorker<Void, String> worker =  new SwingWorker<>(){
        @Override
        protected Void doInBackground() throws Exception {
            File file = new File(absolutePathTextField.getText());
            FileSearch filesearch = new FileSearch(fileNameTextField.getText(), file);

            filesearch.execute();

            int count = filesearch.getResult().size();

            if(count == 0){
                JOptionPane.showMessageDialog(new JFrame(), "There are no such files");
                System.out.println(count);
            }else{
                for(String matched : filesearch.getResult()){
                    publish(matched);
                }
            }
            return null;
        }

        @Override
        protected void process(List<String> chunks) {
            for(String matched : chunks){
                directoriesTextArea.append(matched + "\n");
            }
        }

        @Override
        protected void done() {
            directoriesTextArea.append("\nDone!");

        }
    };

    worker.execute();


}

================= РЕДАКТИРОВАННАЯ ВЕРСИЯ =================

private void startButtonMouseClicked(MouseEvent e) {
    directoriesTextArea.setText("");
    progressBarCounter = 0;
    progressBar1.setValue(0);


    SwingWorker<Void, String> worker = new SwingWorker<Void, String>() {
        List<String> result = new ArrayList<>();

        @Override
        protected Void doInBackground() throws Exception {
            File file = new File(absolutePathTextField.getText());
            FileSearch fileSearch = new FileSearch(fileNameTextField.getText(), file);

            folderCount(file);
            searchFiles(file);

            return null;
        }

        @Override
        protected void process(List<String> chunks) {
            for(String file : chunks){
                directoriesTextArea.append(file + "\n");
            }
        }
        protected void folderCount(File file){
            if (file.isDirectory()) {

                if (file.canRead()) {
                    try {
                        for (File temp : file.listFiles()) {
                            if (temp.isDirectory()) {
                                folderCount(temp);
                                folderCount++;
                            }
                        }
                    } catch (NullPointerException e) {

                    }
                }
            }
            progressBar1.setMinimum(0);
            progressBar1.setMaximum(folderCount);
        }


        protected void searchFiles(File file) {
        progressBarCounter++;
            if (file.isDirectory()) {
                System.out.println("Searching directory ... " + file.getAbsoluteFile());

                if (file.canRead()) {
                    try {
                        for (File temp : file.listFiles()) {
                            progressBar1.setValue(progressBarCounter);
                            if (temp.isDirectory()) {
                                searchFiles(temp);
                            } else {
                                String temp2 = temp.getName().toLowerCase();
                                String trimmedName = temp.getName().toLowerCase();
                                try {
                                    trimmedName = temp2.substring(0, temp2.lastIndexOf("."));
                                } catch (StringIndexOutOfBoundsException e) {

                                }
                                if (fileNameTextField.getText().toLowerCase().equals(trimmedName)) {
                                    System.out.println(fileNameTextField.getText() + " == " + trimmedName);
                                    publish(temp.getAbsolutePath());

                                } else {
                                    System.out.println(fileNameTextField.getText() + "!= " + trimmedName);
                                }

                            }
                        }
                    } catch (NullPointerException e) {

                    }


                } else {
                    System.out.println(file.getAbsoluteFile() + "Permission Denied");
                }
            }
        }
    };
    worker.execute();

}

1 Ответ

0 голосов
/ 17 февраля 2019

Вам не хватает комбинации прогресса / процесса.В фоновом потоке необходимо регулярно вызывать метод процесса, чтобы указать, как далеко находится фоновый процесс.Впоследствии метод прогресса вызывается для вас (в потоке EDT), и там вы можете обновить индикатор выполнения.https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html

...