[英]Java swing indeterminate JProgressBar starting from the left when reaching end instead of bouncing
[英]JProgressBar is updated at the end instead of dynamically
問題是我的應用程序停止運行后,進度條立即更新。 我試圖弄清楚如何在應用程序運行時動態地執行此操作。 經過數小時的失敗嘗試后,我決定問你們。 我嘗試添加propertyChange偵聽器沒有成功。 我的應用程序讀取大量文檔。
它存儲了'documentsTotal',這很容易解釋。 文件總數根據用戶選擇的擴展名而變化。 如果用戶僅選擇.docx,則documentTotal將為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();
}
});
參見文檔: https : //docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#publish(V ...)
您必須使用publish()方法發布進度,並在progress()方法中對其進行處理以更新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);
}
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.