ProgressMonitor всегда заканчивается на 100 даже после увеличения максимума
У меня есть ProgressMonitor
это показывает, пока я обрабатываю некоторые таблицы базы данных. Число таблиц сначала неизвестно, поэтому я создаю ProgressMonitor
с максимальным значением 100.
После того, как обработка началась в SwingWorker
поток, он получает количество таблиц и устанавливает максимум ProgressMonitor
на количество таблиц (около 530 в моем тесте). Тем не менее ProgressMonitor
все еще заканчивается на 100 и останавливает выполнение потока, даже если максимум увеличился, а индикатор выполнения показывает 100/530 точно.
Есть идеи, почему это происходит?
actionListener
чтобы начать ProgressMonitor
а также SwingWorker
(названный TaskThread) от нажатия кнопки:
public void actionPerformed(ActionEvent e)
{
String cmd = e.getActionCommand();
if (cmd.equals("generate")) {
progressMonitor = new ProgressMonitor(this, "Generating...", "", 0, 100);
task = new TaskThread();
task.addPropertyChangeListener(this);
task.execute();
genButton.setEnabled(false);
}
}
PropertyChangeListener
что обновляет ProgressMonitor
:
public void propertyChange(PropertyChangeEvent evt)
{
if ("progress" == evt.getPropertyName() )
{
int progress = (Integer) evt.getNewValue();
progressMonitor.setProgress(progress);
String message = String.format("Completed %d%%.\n", progress);
progressMonitor.setNote(message);
if (progressMonitor.isCanceled() || task.isDone())
{
Toolkit.getDefaultToolkit().beep();
if (progressMonitor.isCanceled()) {
task.cancel(true);
}
genButton.setEnabled(true);
}
}
}
SwingWorker
учебный класс:
class TaskThread extends SwingWorker<Void, Void>
{
@Override
public Void doInBackground()
{
String tableList = tablesArea.getText().trim();
script = "";
String filename = outPath.getText
// Connect to Database
Connection conn = getDbConnection();
if (conn == null)
return null;
try {
// if tableList is blank, get all tables from the From Database afm_tbls table
if (tableList.equals(""))
{
// code omitted
}
}
catch (SQLException se) {
canWriteFile = false;
handleError(se);
}
String[] tables = tableList.split(",");
generateRecordCount(conn, tables);
// Close the connection
if(conn != null)
{
try {
conn.close();
}
catch (Exception ignored) {}
}
// Write SQL code to a file
writeScript(filename);
return null;
}
private void generateRecordCount(Connection conn, String[] tables)
{
setProgressMax(tables.length);
setProgress(0);
// Loop through tables
for (int i = 0; i < tables.length; i++)
{
// Get record count for each table
try {
String sql = "SELECT COUNT(*) AS reccount FROM " + tables[i];
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(sql);
rs.next();
int recCount = rs.getInt("reccount");
if (recCount > 0)
script += tables[i] + ": " + recCount + nl;
// Set progress of SwingWorker, ProgressMonitor is updated by PropertyChangeListener
int prog = getProgress() + 1;
setProgress(prog);
}
catch(SQLException se)
{
handleError(se);
}
}
}
}
1 ответ
Я понял, почему. Так что, надеюсь, для чьей-либо пользы, вот проблема:
Функция SwingWorker.setProgress() имеет границы 0 и 100, поэтому даже если ProgressMonitor
может обрабатывать более высокие максимальные значения, SwingWorker
нить заканчивается IllegalArgumentException
когда значение достигает 101.