同步jprogress栏

时间:2015-04-23 18:25:33

标签: java swing synchronization swingworker jprogressbar

   public class frame11 extends javax.swing.JFrame implements ActionListener,
    PropertyChangeListener {


 public String[] columnNames = { "Path",
                    "File Name",
                    "Size"};
       public  Object[][] data ;
int isJPEG (String s) throws IOException
   { int c=0;//not jpeg

    if ( (s.endsWith(".JPG")) || (s.endsWith(".JPEG"))||(s.endsWith(".jpeg"))||(s.endsWith(".jpg")))
{

                c=1;//is jpeg

}
   return c;
   }

           }


    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)     {//GEN-FIRST:event_jButton1ActionPerformed

    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    JFileChooser fch = new JFileChooser("C:\\");
   jProgressBar1.setValue(0);
    jProgressBar1.setStringPainted(true);
    jTextField1.setText(null);
    jTextField2.setText(null);
    jTextField4.setText(null);
    jLabel7.setText(null);
    data = new Object[15][3]; 
    jTable2.setModel(new DefaultTableModel(data, columnNames));
    fch.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    int ret = fch.showOpenDialog(null);
    int apr=0;
    if (ret==JFileChooser.APPROVE_OPTION)
    {     apr=1;
        jTextField1.setText(fch.getSelectedFile().toString());
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    }
    else jTextField1.setText("Nothing clicked!!!");
    if (apr==1)   {
    jLabel7.setText("Wait Please, While searching ...");
    task = new Task();
    task.addPropertyChangeListener(this);
    task.execute();
    EventQueue.invokeLater(new Runnable() { // Added

            @Override
            public void run() {
                File f = fch.getSelectedFile();
        String s= f.getAbsolutePath();
        int cnt;
        int st=0;
        Path myfile = Paths.get(s);
        if(f.isDirectory()&& Files.isReadable(myfile)){
        try {
        st=st+CheckFiles(f);
        cnt=count(f);
        String ss=Integer.toString(cnt);
        jTextField2.setText(ss);
        jTextField4.setText(Integer.toString(st)); 
        } catch (IOException ex) {
        Logger.getLogger(frame1.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
       jLabel7.setText("Scanning Finished. Thanks for waiting ");
    }

            });

    }

}//GEN-LAST:event_jButton1ActionPerformed
private Task task; 
@Override
public void propertyChange(PropertyChangeEvent evt) {
    if ("progress".equals(evt.getPropertyName())) {
        int progress = (Integer) evt.getNewValue();
        jProgressBar1.setValue(progress);
     System.out.println("Property changed");
    } 
}

//@Override
public void actionPerformed(ActionEvent e) {

}

  class Task extends SwingWorker<Void, Void> {
    @Override
    public Void doInBackground() {
        Random random = new Random();
        int progress = 0;
        setProgress(0);
        while (progress < 100) {
            try {
                Thread.sleep(random.nextInt(100));
            } catch (InterruptedException ignore) {}
            progress += random.nextInt(10);
            setProgress(Math.min(progress, 100));
        }
        return null;
    }

    /*
     * Executed in event dispatching thread
     */
    @Override
    public void done() {
        Toolkit.getDefaultToolkit().beep();
        setCursor(null); 
    }
}

我希望得到您的帮助,我正在尝试扫描我的电脑上的JPEG图像来计算它们。我有两个问题,第一个问题是我使用了jtable,但是在程序结束之前结果永远不会被添加,并且进度条有时会在程序之前结束,有时甚至在之后结束。请帮我解决这两个问题,谢谢。

1 个答案:

答案 0 :(得分:2)

你正在使用SwingWorker来创建一个后台线程 - 很好 - 但你直接从后台线程进行Swing调用 - 坏:

jProgressBar1.setValue(n);

而是从SwingWorker中调用setProgress(...),并将PropertyChangeListener添加到侦听工作者“progress”绑定属性更改的worker。

例如:

有关mcve的示例,其中显示了使用带有SwingWorker的JProgressBar的示例:

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import javax.swing.*;

@SuppressWarnings("serial")
public class TestProgress2 extends JPanel {
   private JProgressBar progressBar = new JProgressBar(0, 100);
   private Action startBackgroundTaskAction = new StartBackgroundTaskAction();

   public TestProgress2() {
      progressBar.setStringPainted(true);
      add(progressBar);
      add(new JButton(startBackgroundTaskAction));
   }

   public void setActionEnabled(boolean enabled) {
      startBackgroundTaskAction.setEnabled(enabled);
   }

   private class StartBackgroundTaskAction extends AbstractAction {
      public StartBackgroundTaskAction() {
         super("Start Background Task");
         putValue(MNEMONIC_KEY, KeyEvent.VK_S);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         progressBar.setString(null);
         progressBar.setValue(0);
         setActionEnabled(false);
         MyTask myTask = new MyTask();
         myTask.addPropertyChangeListener(new MyTaskListener());
         myTask.execute();
      }
   }

   private class MyTaskListener implements PropertyChangeListener {
      @Override
      public void propertyChange(PropertyChangeEvent pcEvt) {
         MyTask myTask = (MyTask) pcEvt.getSource();
         if ("progress".equals(pcEvt.getPropertyName())) {
            int progress = myTask.getProgress();
            progressBar.setValue(progress);
         }
         if (pcEvt.getNewValue() == SwingWorker.StateValue.DONE) {
            setActionEnabled(true);
            progressBar.setString("Done");
            try {
               myTask.get();
            } catch (InterruptedException e) {
               e.printStackTrace();
            } catch (ExecutionException e) {
               e.printStackTrace();
            }
         }
      }
   }

   private class MyTask extends SwingWorker<Void, Void> {
      @Override
      protected Void doInBackground() throws Exception {
         Random random = new Random();
         int progress = 0;
         setProgress(0);
         while (progress < 100) {
             try {
                 Thread.sleep(random.nextInt(1000));
             } catch (InterruptedException ignore) {}
             progress += random.nextInt(10);
             setProgress(Math.min(progress, 100));
         }
         return null;
      }
   }

   private static void createAndShowGui() {
      TestProgress2 mainPanel = new TestProgress2();

      JFrame frame = new JFrame("TestProgress2");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
相关问题