2013-06-05 79 views
1

我试图在我的应用程序中添加一个进度条,该进度条根据命令行或Java代码进行,我的应用程序是一种设置或安装的另一种Etaps程序。在命令行或复制任务中进度的进度条

我发现所有进度条都不与复制任务交互,这意味着我不知道复制任务何时完成。

我想我的进度条,在这些线路的功能进步命令:

try { 
      Runtime.getRuntime().exec("cmd.exe /k mkdir \""+dossier+"\\results\" &&" 
        + " mkdir \""+dossier+"\\results\\basededonnees\" &&" 
        + " mkdir \""+dossier+"\\results\\ordonnances\" &&" 
        + " mkdir \""+dossier+"\\results\\piecesjoins\""); 

      Runtime.getRuntime().exec("cmd.exe /k mkdir \""+dossier+"\\basededonnees\" &&" 
        + " echo CREATE DATABASE "+nomBase+"; >> \""+dossier+"\\basededonnees\\CreerDB.sql\""); 

      Runtime.getRuntime().exec("cmd.exe /k xcopy apps\\lib \""+dossier+"\\lib\" &&" 
        + " set path=%path%;C:\\wamp\\bin\\mysql\\mysql5.5.20\\bin &" 
        + " set path=%path%;C:\\wamp\\bin\\mysql\\mysql5.5.24\\bin &" 
        + " mysql -u root < \""+dossier+"\\basededonnees\\CreerDB.sql\""); 

    } catch (IOException ex) { 
     JOptionPane.showMessageDialog(null, "Une erreur est survenue \n" + ex.getMessage(), "Information", JOptionPane.INFORMATION_MESSAGE); 
    } 

档案= 'C:\ Program Files文件\ NameOfMyApps' nomBase = 'NameOfMyDataBase'

当所有的命令和复制任务完成我希望酒吧达到100%。

预先感谢您,并遗憾的语言,因为我不metrized一个良好的英语

更好地解释这里是截图: enter link description here

http://www.4shared.com/download/-b2S2bFN/apps.jpg?tsid=20130605-124016-afcd18b4

回答

1

喜见下面的例子

package com.test; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class Copy { 

    private static final String PING_LOCALHOST = "ping localhost"; 

    /** 
    * @param args 
    * @throws InterruptedException 
    */ 
    public static void main(String[] args) throws InterruptedException { 
     // TODO Auto-generated method stub 
     ProgressBar progressBar = new ProgressBar(); 
     progressBar.showProgress(); 
     // first command 
     runCommand(progressBar, PING_LOCALHOST, 25); 
     runCommand(progressBar, PING_LOCALHOST, 50); 
     runCommand(progressBar, PING_LOCALHOST, 75); 
     runCommand(progressBar, PING_LOCALHOST, 100); 

    } 

    private static void runCommand(ProgressBar progressBar, String command, int barValue) throws InterruptedException { 
     CopyThread copyThread = new Copy().new CopyThread(command); 
     copyThread.start(); 
     // wait for thread to die 
     copyThread.join(); 
     progressBar.updatePercent(barValue); 
    } 

    private class CopyThread extends Thread { 
     private String cmd; 

     public CopyThread(String command) { 
      this.cmd = command; 
     } 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       String line; 
       Process p = Runtime.getRuntime().exec(cmd); 
       BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
       while ((line = input.readLine()) != null) { 
        System.out.println(line); 
       } 
       input.close(); 
      } catch (Exception err) { 
       err.printStackTrace(); 
      } 
     } 

    } 

} 

进度

package com.test; 

import java.awt.Color; 
import java.awt.Font; 

import javax.swing.JFrame; 
import javax.swing.JProgressBar; 

public class ProgressBar { 

    private JFrame progressFrame; 
    private JProgressBar progressBar; 

    /** 
    * Create the application. 
    */ 
    public ProgressBar() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 

     progressFrame = new JFrame(); 
     progressFrame.setTitle("Test progress bar"); 
     progressFrame.setResizable(false); 
     progressFrame.setBounds(100, 100, 640, 79); 
     progressFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     progressFrame.getContentPane().setLayout(null); 

     progressBar = new JProgressBar(); 
     progressBar.setFont(new Font("Tahoma", Font.PLAIN, 16)); 
     progressBar.setBackground(new Color(255, 255, 255)); 
     progressBar.setIndeterminate(false); 
     progressBar.setStringPainted(true); 
     progressBar.setForeground(new Color(0, 128, 0)); 
     progressBar.setBounds(0, 0, 634, 52); 

     progressFrame.getContentPane().add(progressBar); 
    } 

    public void showProgress() { 
     initialize(); 
     progressFrame.setVisible(true); 
    } 

    public void closeProgress() { 
     progressFrame.dispose(); 
     progressFrame.setVisible(false); 
    } 

    public void updatePercent(int value) { 
     progressBar.setValue(value); 
    } 
} 
+0

的一切,用于已经可以看到每JProgressBar的方法必须被包裹在了invokeLater – mKorbel

+0

非常感谢你这是为我工作!但进度条依赖于线程(sleep(2000);)不依赖于命令,我不知道是否可能。显然这个解决方案对我来说只是我必须测量(睡眠(对复制的时间估计);)再次感谢你。 – Mouad

+0

不,你不应该依赖线程睡眠那只适用于虚拟....如果你远程线程睡眠,那么它将取决于复制所花费的时间 – Makky