Как добавить монитор прогресса при загрузке / выгрузке из / в sftp - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь добавить монитор прогресса в свою программу, чтобы увидеть процент выполнения операции загрузки или выгрузки с сервера sftp. В частности, я хотел бы открыть новое окно (JFrame) и показать там% с именем обрабатываемого файла.

Для установления соединения я использую библиотеку Jsch. Я не могу понять, как и какую часть моего кода я должен изменить. Я пытался добавить монитор JProgress, но я не знаю, куда его вставить, потому что у меня есть цикл for. Я попытался вставить SwingWorker, но нашел только пример с System.out.println, а не "графический" способ. Вот часть моего кода:

public void connect(String host, String user, String pwd, int port) throws JSchException, SftpException, IOException {

    try {
        JSch jsch = new JSch();
        session = jsch.getSession(user, host, port);            
        session.setPassword(pwd);                   
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();                                      
        sftpChannel = (ChannelSftp) session.openChannel("sftp");    
        sftpChannel.connect();                                                  
    } catch(JSchException | SftpException e) {                      
        JOptionPane.showMessageDialog(null, "ERROR!");
    JLabel label = new JLabel("ERROR! ");
    contentPane.add(label, BorderLayout.NORTH);
        System.out.println(e);
    }    
}


public void downloadFile() {
    UIManager.put("ScrollPane.background", Color.BLACK);
    UIManager.put("List.background", Color.WHITE);
    UIManager.put("List.foreground", Color.BLACK);
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e1) {
        e1.printStackTrace();
    }

    JFileChooser chooser = new JFileChooser();
    chooser.setCurrentDirectory(new java.io.File("."));
    chooser.setDialogTitle("Browse the folder to process");
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    chooser.setAcceptAllFileFilterUsed(false);

   if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
       path = new File(chooser.getSelectedFile().getAbsolutePath());
       pathName = path.toString();      

        dwnPending =true;
       for (ChannelSftp.LsEntry oListItem : list) { // Iterate objects in the list to get file/folder names.

           currentFileDownload= oListItem.getFilename();

           segnaLista = segnaLista - 1;
        try {
                sftpChannel.get("pub/example/" + currentFileDownload, pathName);        
            } catch (SftpException e) {
                JOptionPane.showMessageDialog(null, "Impossible to download the file " + currentFilDownload+ ". SFTP error. The file will not be removed from the server");
            }
            catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Impossibile to download file " + currentFilDownload);
            }
       dwnPending =false;
       JOptionPane.showMessageDialog(null, "Download completed in: " + pathName);   
    } 
}

Я бы хотел реализовать это максимально простым способом. Только приблизительно понять, когда перевод будет завершен.

...