Java JProgressBar在最后更新,而不是动态更新
问题是我的进度条在我的应用程序停止运行后立即更新。我试图弄清楚如何在应用程序运行时动态地执行此操作。 经过几个小时不成功的尝试,我决定问问你们。我尝试添加propertyChange listener,但没有成功。我的应用程序读取大量文档 它存储了“documentsTotal”,这是不言自明的。文档总数根据用户选择的扩展名而变化。如果用户选择.docx only,则documentsTotal将是10个文档,而不是60个文档 “documentsTagged”是我的应用程序当前正在读取的队列中的文档数。我运行这个应用程序,它可以一次性读取这些文档。因此,我不知道如何使我的JProgressBar动态 这是我负责该过程的代码的一部分。在用户按下“运行”按钮后,它正在运行Java JProgressBar在最后更新,而不是动态更新,java,swing,progress-bar,jprogressbar,Java,Swing,Progress Bar,Jprogressbar,问题是我的进度条在我的应用程序停止运行后立即更新。我试图弄清楚如何在应用程序运行时动态地执行此操作。 经过几个小时不成功的尝试,我决定问问你们。我尝试添加propertyChange listener,但没有成功。我的应用程序读取大量文档 它存储了“documentsTotal”,这是不言自明的。文档总数根据用户选择的扩展名而变化。如果用户选择.docx only,则documentsTotal将是10个文档,而不是60个文档 “documentsTagged”是我的应用程序当前正在读取的队列中
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();
}
});
见文件:
您必须使用publish方法发布进度,并在progressbar更新过程中处理它
不只是想法:
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);
}
}
};
Swing是单线程的。所有GUI图形和事件处理程序都在单个线程中运行。你应该把你的actionPerformed放到一个单独的线程中……我已经为actionPerformed创建了一个新线程。没有解决问题。我不知道如何使我的JProgressBar动态。-请阅读上Swing教程中的部分,以获取一个工作示例。顺便问一下,你读过JProgressBarAPI吗?它还有一个到教程的链接。我得到一个错误:方法publishVoid。。。在类型中,SwingWorker不适用于任何想法中的参数如何克服此问题?@dsafasfsa请尝试SwingWorker。它也应该是processList对象{和Integer progress=objects.getobjects.size-1;@dsafasfsa I updated answer。它现在应该可以编译了。