我有一个ProgressMonitor,它在处理一些数据库表时显示。一开始不知道表的数量,所以我创建了最大值为100的ProgressMonitor。
一旦在SwingWorker线程中开始处理,它就会获得表数,并将ProgressMonitor的最大值设置为表数(在我的测试中大约有530个表)。然而,ProgressMonitor仍然完成在100并且停止线程的执行,即使最大值已经增加并且进度条准确地显示了100/530。
知道为什么会这样吗?
从按钮按下启动ProgressMonitor和SwingWorker (命名为TaskThread)的ProgressMonitor:
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);
}
}
}
}发布于 2014-05-30 19:23:21
我想出了原因。因此,希望对其他人有利,以下是问题所在:
SwingWorker.setProgress()函数的界限为0和100,因此即使ProgressMonitor可以处理更高的最大值,但当值达到101时,SwingWorker线程将由IllegalArgumentException结束。
https://stackoverflow.com/questions/23961411
复制相似问题