JProgressBar最后更新而不是动态更新

问题描述 投票:0回答:1

我的应用程序停止运行后,问题就是我的进度条更新。我正在试图弄清楚如何在应用程序运行时动态地执行它。经过多次不成功的尝试,我决定问你们。我试过添加propertyChange监听器但没有成功。我的应用程序读取大量文档。

它存储'documentsTotal',这是非常明显的。文档总数会根据用户选择的扩展名而变化。如果用户只选择.docx,那么documentsTotal将是10而不是60个文档。

'documentsTagged'是我的应用当前正在阅读的队列中的文档数。我运行应用程序,它一次性读取这些文档。因此,我不知道如何让我的JProgressBar动态化。

这是我负责该流程的代码的一部分。它在用户按下“运行”按钮后运行。

        runBtn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            progressBar.setValue(0);
            ArrayList<JCheckBox> checkboxes = new ArrayList<JCheckBox>();
            stopBtn.setEnabled(true);
            extensions.clear();
            consoleTextArea.setText("");

            done = false;

            for( Component comp : panel.getComponents() ) {
               if( comp instanceof JCheckBox) checkboxes.add( (JCheckBox)comp );
            }

            for (JCheckBox jcb : checkboxes) {
                if(jcb.isSelected()) {
                    extensions.add(jcb.getText());
                }
            }

            String sql = "SELECT document, file_name, data FROM documents ";

            for (int i = 0; i < extensions.size(); i++) {
                if(i == 0) {
                    sql += "WHERE file_name like '%" + extensions.get(i) + "' ";
                } else if (i >= 1) {
                    sql += "OR file_name like '%" + extensions.get(i) + "' ";
                }
            }

            if(!txtFilename.getText().equals("") && extensions.isEmpty()) {
                sql += "WHERE file_name like '" + txtFilename.getText() + "' ";
            } else if(!txtFilename.getText().equals("")) {
                sql += "AND file_name like '" + txtFilename.getText() + "' ";
            }

            if(!txtrWhere.equals(null)) {
                sql += txtrWhere.getText();
            }

            if(txtFilename.getText().equals("") && extensions.isEmpty()) {
                sql += "WHERE file_name like '%.pdf' OR file_name like '%.doc' OR file_name like '%.docm' "
                        + "OR file_name like '%.dox' OR file_name like '%.xls' OR file_name like '%.xlsx' ";
            }

            sqlParam = sql;

            SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
                @Override
                protected Void doInBackground() throws Exception {

                    KeywordsRecognition app = new KeywordsRecognition(sqlParam);

                      int progress = 0;
                      setProgress(0);

                      int documentsTotal = app.getDocumentsTotal();
                      int documentsTagged = app.getDocumentsTagged();

                      progressBar.setMaximum(documentsTotal);

                      while (progress < documentsTotal) {
                            documentsTotal = app.getDocumentsTotal();
                            documentsTagged = app.getDocumentsTagged();
                            progress += documentsTagged;
                            setProgress(progress);
                            progressBar.setValue(progress);
                      }

                    return null;        
                }
            };

            stopBtn.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    worker.cancel(true);
                    stopBtn.setEnabled(false);
                }
            });

            worker.execute();
        }
    });
java swing progress-bar jprogressbar
1个回答
1
投票

见文档:https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#publish(V...)

您必须使用publish()方法发布进度并在progress()方法中处理它以更新进度条。

未测试(仅限于想法):

   SwingWorker<Void, Void> worker = new SwingWorker<Void, Integer>() {
            @Override 
            protected Void doInBackground() throws Exception {

                KeywordsRecognition app = new KeywordsRecognition(sqlParam);

                  int progress = 0;
                  setProgress(0);

                  int documentsTotal = app.getDocumentsTotal();
                  int documentsTagged = app.getDocumentsTagged();

                  progressBar.setMaximum(documentsTotal);

                  while (progress < documentsTotal) {
                        documentsTotal = app.getDocumentsTotal();
                        documentsTagged = app.getDocumentsTagged();
                        progress += documentsTagged;
                        setProgress(progress);  
                        //sent to ui
                        publish(progress);

                  } 

                return null;         
            } 

      @Override
      protected void process(List<Integer> chunks) {
           //here update ui
           for(Integer p : chunks){
                  progressBar.setValue(p);
            }
      }
    }; 
© www.soinside.com 2019 - 2024. All rights reserved.