Search code examples
javamultithreadingswingjprogressbar

Indeterminate Progress bar wont show


I have an application that copies files (via ADB) to an android tablet. It takes some time so I want to display a popup with an indeterminate progress bar on it. When the copy task is complete then I want to be able to stop the progress bar and let the user close the dialog.

At the moment I have not added the extra dialog box and am just trying to get the progress bar working. The problem I have is that the progress bar is not showing at the start of the task, but I dont know why. The progressbar shows when the dialog box saying sync complete appears. The code is:

        progress = new JProgressBar(0, 100);
        progress.setForeground(new Color(255, 99, 71));
        progress.setIndeterminate(true);
        progress.setValue(0);
        progress.setPreferredSize( new Dimension( 300, 20 ) );
        progress.setBounds( 278, 12, 260, 20 );
        progress.setVisible(false);
        progress.setString("Sync in progress");
        progress.setStringPainted(true);
        contentPane.add(progress);
        pushtotab = new JButton("");
        pushtotab.addActionListener(new ActionListener() {


 public void actionPerformed(ActionEvent arg0) {
                        if (buildpathset==1){
                            try{
                            setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                            progress.setVisible(true);
                            wiredsync();
                        }finally{
                            JOptionPane.showMessageDialog(null, "sync complete. ",null, buildpathset);
                             setCursor(Cursor.getDefaultCursor());      
                             progress.setVisible(false);
                        }}else{ 
    //warning in here later - TO Do
                }
                }
                });

public void wiredsync(){

        try {

                    Process process = Runtime.getRuntime().exec("adb" + " push "+ buildpath + " " + adbtabletsync);
                    InputStreamReader reader = new InputStreamReader(process.getInputStream());
                    Scanner scanner = new Scanner(reader);
                    scanner.close();
                    int exitCode = process.waitFor();
                    System.out.println("Process returned: " + exitCode);

                } catch(IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    }//end 

Thanks for the help,

Andy


Solution

  • pooyan has the right idea -- do the long running process in a background thread -- but gives the wrong library example, since your program is a Swing program and not an Android program. The canonical answer to this for Swing is to do your long-running task in the doInBackground() method of a SwingWorker.

    Please hold while I find a better example...

    Something like so:

    if (buildpathset == 1) {
       setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
       progress.setVisible(true);
    
       // create my SwingWorker object
       final SwingWorker<Void, Void> myWorker = new SwingWorker<Void, Void>() {
          protected Void doInBackground() throws Exception {
             // here is my long running task, calling in background
             // thread
             wiredsync();
             return null;
          };
       };
    
       // this allows me to be notified when the SwingWorker has
       // finished
       myWorker.addPropertyChangeListener(new PropertyChangeListener() {
    
          @Override
          public void propertyChange(PropertyChangeEvent pcEvt) {
             // if the SwingWorker is done
             if (pcEvt.getNewValue() == SwingWorker.StateValue.DONE) {
                // notify the user
                JOptionPane.showMessageDialog(null, "sync complete. ",
                      null, buildpathset);
                setCursor(Cursor.getDefaultCursor());
                progress.setVisible(false);
    
                try {
                   // one way to catch any errors that occur in
                   // SwingWorker
                   myWorker.get();
                } catch (InterruptedException | ExecutionException e) {
                   e.printStackTrace();
                }
    
             }
          }
       });
       // run my SwingWorker
       myWorker.execute();
    } else {
       // warning in here later - TO Do
    }
    

    For more on this, please check out: Lesson: Concurrency in Swing