синхронизировать панель jprogress

   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, но результаты никогда не добавляются до завершения программы, а индикатор выполнения не синхронизируется, иногда он заканчивается до программы, а иногда после. пожалуйста, помогите мне решить эти две проблемы и спасибо.


person sosono    schedule 23.04.2015    source источник


Ответы (1)


Вы используете SwingWorker для создания фонового потока — хорошо — но вы делаете вызовы Swing непосредственно из этого фонового потока — плохо:

jProgressBar1.setValue(n);

Вместо этого вызовите setProgress(...) из вашего SwingWorker и добавьте PropertyChangeListener к рабочему процессу, который прослушивает изменения в связанном свойстве worker "progress".

Например:


Для примера mcve, который показывает пример использования JProgressBar с SwingWorker:

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();
         }
      });
   }
}
person Hovercraft Full Of Eels    schedule 23.04.2015
comment
Я впервые использую панель jprogress. Не могли бы вы дать мне более подробную информацию или предложить мне хороший учебник. Большое спасибо. - person sosono; 23.04.2015
comment
@sosono: см. ссылки на мои примеры кода в редактировании моего ответа. Также в учебнике JProgressBar, я думаю, есть пример. - person Hovercraft Full Of Eels; 23.04.2015
comment
У меня все та же проблема, я обновлю код, пожалуйста, скажите мне, что я сделал не так. Благодарю. - person sosono; 23.04.2015
comment
@sosono: создайте и опубликуйте небольшую, но простую полную программу, иллюстрирующую вашу проблему, MCVE. Пожалуйста, проверьте ссылку для получения подробной информации об этом очень полезном инструменте. - person Hovercraft Full Of Eels; 24.04.2015
comment
пожалуйста, проверьте мой предыдущий пост, я написал все, кроме функции checkfiles, которая подсчитывает количество файлов jpeg в каталоге - person sosono; 24.04.2015
comment
@sosono: если вы имеете в виду код в своем исходном вопросе, да, я его проверил, но я не могу скопировать и вставить его в свою IDE, скомпилировать и запустить, поэтому я застрял. Я не хочу видеть всю вашу программу, так как это загрузит нас большим количеством кода, не относящегося к вашей проблеме, но я хочу увидеть соответствующий код, который я могу скомпилировать и запустить. Опять же, если вы хотите, чтобы мы лучше поняли вашу проблему, рассмотрите возможность создания и публикации минимальной компилируемой, исполняемой, примера программы или MCVE. - person Hovercraft Full Of Eels; 24.04.2015
comment
@sosono: для примера того, что я имею в виду, см. мой MCVE, который я опубликовал как редактирование моего ответа, в котором используется часть вашего кода. - person Hovercraft Full Of Eels; 24.04.2015
comment
@sosono: ой! старайтесь избегать сгенерированного NetBeans кода при создании минимальных программ. Кроме того, почему JTable? Какое отношение это имеет к вашей проблеме? Опять же, пожалуйста, сократите свой код до необходимого минимума. Вы ознакомились с моим минимальным примером кода? Изменить: и ваш код не будет компилироваться, так как в нем отсутствует куча переменных. Опять же, пожалуйста, сократите его и проверьте, прежде чем публиковать здесь. Ваш код плохо отформатирован (что-то, что ваша IDE должна сделать для вас), что затрудняет чтение... - person Hovercraft Full Of Eels; 24.04.2015
comment
Прошу прощения за это, jtable очень важен для меня, мне нужно, чтобы он обновлялся именем файла JPEG при его обнаружении. Я не знаю, какую IDE вы используете. если я просто отправлю вам файл, вы можете просто скопировать и вставить его в свой проект и запустить его. - person sosono; 24.04.2015
comment
@sosono: я не сомневаюсь, что JTable важен для вас, но остается вопрос: какое отношение он имеет к вашей текущей проблеме? Нет, не отправляйте файл целиком, и IDE вообще не имеет значения, поскольку минимальная программа должна компилироваться и запускаться из командной строки. Если у вас все еще есть проблемы, просто создайте и опубликуйте минимальную примерную программу, как я сделал в своем ответе выше. Блин, используйте мой код выше в качестве основы для вашего примера. В противном случае вы будете отправлять большой код, большая часть которого совершенно не имеет отношения к рассматриваемой проблеме. - person Hovercraft Full Of Eels; 24.04.2015
comment
Большое спасибо за вашу помощь. Я нашел решение своей проблемы. Это вызов функции (выполнение которой занимает много времени) из задачи. - person sosono; 24.04.2015
comment
@sosono: рад, что ты нашел решение. Однако, если он вызывается из фоновой задачи, это не должно вызывать проблемы. - person Hovercraft Full Of Eels; 24.04.2015