Итак, я создаю JProgressBar, который отображает ход манипуляции с CSV, где каждая строка читается и проверяется, если в обязательных ( NOT NULL ) столбцах нет нулевых значений.Для этого я создал задачу SwingWorker, которая обрабатывает преобразование количества строк в файле до 100% от максимального значения прогресса и суммирует прогресс с правильной скоростью.
Это SwingWorker:
public static class Task extends SwingWorker<String, Object> {
private int counter;
private double rate;
public Task(int max) {
// Adds the PropertyChangeListener to the ProgressBar
addPropertyChangeListener(
ViewHandler.getExportDialog().getProgressBar());
rate = (float)100/max;
setProgress(0);
counter = 0;
}
/** Increments the progress in 1 times the rate based on maximum */
public void step() {
counter++;
setProgress((int)Math.round(counter*rate));
}
@Override
public String doInBackground() throws IOException {
return null;
}
@Override
public void done() {
Toolkit.getDefaultToolkit().beep();
System.out.println("Progress done.");
}
}
My PropertyChangeListener
, , который реализуется оболочкой JProgressBar :
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setIndeterminate(false);
progressBar.setValue((Integer) evt.getNewValue());
}
}
Затем, где я на самом деле его использую, я переопределяю doInBackground()
метод с нужной мне обработкой, вызывающий step()
на каждой итерации.
Task read = new Task(lines) {
@Override
public String doInBackground() throws IOException {
while(content.hasNextValue()) {
step();
// Processing
}
return output.toString();
}
};
read.execute();
return read.get();
Итак, что происходит : обработка работает и завершается успешно, затем вызывается done()
исразу после этого propertyChange()
регистрирует два события «состояния» и одно событие «прогресс», устанавливая прогресс ProgressBar от 0% до 100%.
Что происходит ЧтоЯ думал, что это происходит ( проверьте ответ Hovercraft для уточнения) описан в JavaDocs:
Поскольку PropertyChangeListeners уведомляются асинхронно на несколько потоков вызова Event DispatchСвязи с методом setProgress могут произойти до того, как будет вызван любой PropertyChangeListeners.В целях производительности все эти вызовы объединены в один вызов только с последним аргументом вызова.
Итак, после всего этого мой вопрос : я что-то не так делаю?Если нет, то есть ли способ заставить поток обработки событий уведомлять PropertyChangeListeners, когда происходит onProgress (), или, по крайней мере, время от времени?
Obs .: обработка, которую ятестирование занимает от 3 до 5 с.