2017-08-19 4 views
-4
// Can anyone please help 

import java.awt.Color; 

public class MoveTools { 
    private static String ROOT_DIR = "C:/Users/Amitesh/Desktop/copy/"; 

    // private static String newpath = "C:/Users/Amitesh/Desktop/move/"; 

    private static String newpath; 
    static long timeTaken; 
    static int i = 0; 

    JProgressBar progressBar; 
    JFrame frame; 
    JTextField textField; 
    JTextField textField_1; 
    JButton btnMove; 
    JLabel lblSelectExcelFile; 
    JLabel lblMoveTo; 
    JButton btnBrowse; 
    JButton btnLocation; 
    JLabel lblA; 
    JLabel lblB; 
    JLabel lblSuccess; 

    public static void main(String[] args) { 
     MoveTools window = new MoveTools(); 
     window.frame.setVisible(true); 
    } 

    public MoveTools() { 
     initialize(); 
    } 

    public void initialize() { 
     frame = new JFrame("File Move Tools"); 
     frame.getContentPane().setBackground(Color.LIGHT_GRAY); 
     frame.getContentPane().setForeground(Color.GREEN); 
     frame.setBounds(100, 100, 450, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 
     frame.setResizable(false); 

     btnMove = new JButton("Move"); 

     ButtonListener listener = new ButtonListener(); 
     btnMove.addActionListener(listener); 

     Color cr1 = new Color(79, 116, 202); 
     btnMove.setBackground(cr1); 
     btnMove.setToolTipText("Click here to move"); 
     btnMove.setBounds(163, 185, 89, 23); 
     frame.getContentPane().add(btnMove); 

     lblSelectExcelFile = new JLabel("Select CSV File"); 
     lblSelectExcelFile.setBounds(25, 23, 112, 23); 
     frame.getContentPane().add(lblSelectExcelFile); 

     lblMoveTo = new JLabel(" Move To....."); 
     lblMoveTo.setBounds(25, 67, 68, 23); 
     frame.getContentPane().add(lblMoveTo); 

     progressBar = new JProgressBar(0, 100); 
     progressBar.setBounds(70, 136, 296, 23); 
     progressBar.setValue(0); 
     progressBar.setStringPainted(true); 
     progressBar.setForeground(Color.blue); 
     progressBar.setBackground(Color.white); 
     frame.getContentPane().add(progressBar); 

     textField = new JTextField(); 
     textField.setBounds(144, 24, 163, 20); 
     textField.setToolTipText("Select CSV File"); 
     textField.setEditable(false); 
     frame.getContentPane().add(textField); 
     textField.setColumns(10); 

     btnBrowse = new JButton("Browse"); 
     Color cr = new Color(128, 171, 206); 
     btnBrowse.setBackground(cr); 
     btnBrowse.setBounds(303, 23, 92, 23); 
     frame.getContentPane().add(btnBrowse); 
     btnBrowse.addActionListener(listener); 

     textField_1 = new JTextField(); 
     textField_1.setBounds(144, 68, 163, 20); 
     textField_1.setToolTipText("Select Move To Location"); 
     textField_1.setEditable(false); 
     frame.getContentPane().add(textField_1); 
     textField_1.setColumns(10); 

     btnLocation = new JButton("Location"); 
     btnLocation.setBackground(cr); 
     btnLocation.setBounds(303, 67, 92, 23); 
     frame.getContentPane().add(btnLocation); 
     btnLocation.addActionListener(listener); 

     lblA = new JLabel(); 
     lblA.setForeground(Color.RED); 
     lblA.setBounds(144, 43, 180, 14); 
     frame.getContentPane().add(lblA); 

     lblB = new JLabel(); 
     lblB.setForeground(Color.RED); 
     lblB.setBounds(144, 88, 180, 14); 
     frame.getContentPane().add(lblB); 

     lblSuccess = new JLabel(); 
     lblSuccess.setForeground(new Color(0, 51, 153)); 
     lblSuccess.setBounds(70, 121, 241, 14); 
     frame.getContentPane().add(lblSuccess); 

     Image icon = Toolkit.getDefaultToolkit().getImage("./img/move.png"); 
     frame.setIconImage(icon); 
    } 

    private class ButtonListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == btnBrowse) { 
       JFileChooser filechooser = new JFileChooser(); 
       filechooser.setDialogTitle("Select CSV File"); 
       filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
       FileNameExtensionFilter filter = new FileNameExtensionFilter(
         "CSV Files", "csv"); 
       filechooser.setFileFilter(filter); 
       filechooser.setAcceptAllFileFilterUsed(false); 
       int rlValue = filechooser.showOpenDialog(null); 
       if (rlValue == JFileChooser.APPROVE_OPTION) { 
        textField.setText(filechooser.getSelectedFile().toString()); 
       } 
       lblA.setText(null); 
      } 

      else if (e.getSource() == btnLocation) { 
       JFileChooser filechooser = new JFileChooser(); 
       filechooser.setDialogTitle("Select Location"); 
       filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
       filechooser.setAcceptAllFileFilterUsed(false); 
       int rlValue = filechooser.showOpenDialog(null); 
       if (rlValue == JFileChooser.APPROVE_OPTION) { 
        textField_1.setText(filechooser.getSelectedFile() 
          .toString()); 
       } 
       lblB.setText(null); 
      } else if (e.getSource() == btnMove) { 

       if (textField.getText().isEmpty()) { 
        lblA.setText("Please Select CSV File!"); 
       } 

       else if (textField_1.getText().isEmpty()) { 
        lblB.setText("Please Select Location!"); 
       } else { 
        String csvFileLocation = textField.getText(); 
        newpath = textField_1.getText(); 

        MoveTools service = new MoveTools(); 
        service.moveDir(csvFileLocation); 
        // service.moveDir(service.extract(csvFileLocation)); 

        // Thread Execution 
        Work w = new Work(); 
        w.start(); 
       } 
      } 
     } 
    } 

    // Read CSV File 
    public List<String> extract(String fileName) throws IOException { 
     List<String> paths = new ArrayList<>(); 
     try (BufferedReader br = new BufferedReader(new FileReader(new File(
       fileName)))) { 
      String line = null; 
      String formattedPath = ""; 
      while ((line = br.readLine()) != null) { 
       String s = line.split(",,,")[1]; 
       if (s.startsWith("Path")) { 
        String data = s.substring(s.indexOf("{") + 1, 
          s.indexOf("}")); 
        for (String splitData : data.split(";")) { 
         splitData = splitData 
           .substring(splitData.indexOf("\\") + 1, 
             splitData.length()); 
         formattedPath = splitData.replace("\\", "/"); 
         paths.add(formattedPath); 
        } 
       } 
      } 
     } 
     System.out.println("Total No of path Found : " + paths.size()); 
     return paths; 
    } 

    // Logic To Move Directory 

    public void moveDir(String fileName) { 
     long timeIn = 0; 
     timeIn = System.currentTimeMillis(); 
     boolean success = false; 

     int count = 0; 
     Path path = null; 
     String actualPath = ""; 
     try { 
      List<String> paths = extract(fileName); 
      for (String s : paths) { 
       count++; 
       actualPath = ROOT_DIR + s; 
       path = Paths.get(actualPath).toAbsolutePath(); 

       // System.out.println("path: " + path); 

       // source file location 

       String sPath = path.toString(); 
       // System.out.println("SPath: " + sPath); 
       File sourceFile = new File(sPath); 

       String destPath = newpath + s; 
       // System.out.println("DestPath: " + destPath); 
       File destFile = new File(destPath); 

       String ParentDir = destFile.getParent(); 

       File destDir = new File(ParentDir); 
       //FileUtils.moveFileToDirectory(sourceFile, destDir, true); 
       FileUtils.copyFileToDirectory(sourceFile, destDir, true); 
      } 
     } catch (IOException e) { 
      System.out.println("Error Message : " + e.getLocalizedMessage()); 

      // Create Log Details 
      RandomAccessFile raf; 
      try { 
       raf = new RandomAccessFile("./FileNotFound.log", "rw"); 

       String msg = e.getMessage() + "; "; 
       byte[] mgs1 = msg.getBytes(); 
       raf.seek(raf.length()); 
       raf.write(mgs1); 
       raf.close(); 
      } catch (FileNotFoundException e1) { 
       e1.printStackTrace(); 
      } catch (Exception e2) { 
       e2.printStackTrace(); 
      } 
     } 
     long timeOut = System.currentTimeMillis(); 
     timeTaken = timeOut - timeIn; 
     System.out.println("Time Taken: " + timeTaken); 

     System.out.println("Total Directory created : " + count); 
    } 

    class Work extends Thread { 
     public void run() { 
      progressBar.setMaximum((int) MoveTools.timeTaken); 

      while (i <= MoveTools.timeTaken) { 
       progressBar.paintImmediately(0, 0, 200, 25); 
       progressBar.setValue(i); 
       i++; 
      } 
      lblSuccess.setText("File Moved Successfully in " + timeTaken 
        /1000.0 + " Seconds!"); 
     } 
    } 
} 

Dans ce programme, j'ai créé une barre de progression, mais elle démarre après que mon programme a copié tous les fichiers d'un dossier vers un autre. Quelqu'un peut-il vérifier et me donner une solution appropriée?ajouter une barre de progression dans mon application pour suivre le déplacement de la tâche

Répondre

1

Vous avez problème filetage:

Votre méthode est moveDir fonctionne sur de AWT Event Dispatching Discussion, et tient donc. Pendant qu'il le maintient, aucune mise à jour de l'écran n'est effectuée (celles-ci sont envoyées via des événements).

Aussi votre classe Work ne serait pas en mesure de mettre à jour le GUI, car il s'exécute sur un thread différent. Pour accéder au GUI vous devez envoyer des événements sur le EDT. Pour ce faire, il y a la méthode de commodité de SwingUtilities.invokeLater(). Cela ajoute un Runnable à la file d'attente de tâches EDT.

Voir aussi ce Java Tutorial on Concurency in Swing

2

Le flux est mauvais pour votre but, vous devez mettre ces codes:

   MoveTools service = new MoveTools(); 
       service.moveDir(csvFileLocation); 

dans la course() de votre fil. En règle générale, le travail qui nécessite beaucoup de temps (et c'est la raison principale pour laquelle vous devez montrer la progression) doit être placé dans la méthode run() du thread.

Et à l'intérieur du déplacementDir() de travail, il devrait être en mesure de signaler la progression au thread et laissez-le mettre à jour l'interface de progression en conséquence. Vous pouvez par exemple ajouter une interface d'écoute comme:

public class MoveTools { 
    public static interface Listener { 
     void onProgress(String message, int currentProgress); 
    } 

    private Listener listener = null; 

    public void setListener(Listener listener) { 
     this.listener = listener; 
    } 

Tout en faisant le travail, les MoveTools peuvent rendre compte des progrès à son auditeur:

if (listener != null) { 
     listener.onProgress("Working...", 50); 
    } 

Ensuite, le thread appelant peut mettre l'auditeur et mettre à jour le barre de progression (note maintenant, au travail doivent accepter MoveTools en tant que paramètre car il nécessaire d'attacher un auditeur à s'informer des progrès en cours):

public Work(MoveTools moveTools) { 
     moveTools.setListener(new MoveTools.Listener() {     
      @Override 
      public void onProgress(String message, int currentProgress) { 
       SwingUtilities.invokeLater(new Runnable() { 
        @Override 
        public void run() { 
         progressBar.setString(message); 
         progressBar.setValue(currentProgress); 
        } 
       }); 
      } 
     }); 
    } 

Avis Je fais la mise à jour de progressBar en utilisant SwingUtilities.invokeLater() car vous devez toujours modifier l'interface graphique dans le thread d'envoi d'événement (EDT), et le thread de travail n'est pas EDT.