我处理一些数据库表时显示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);
}
}
}
}
答案 0 :(得分:1)
我弄明白了为什么。所以希望为了别人的利益,这就是问题所在:
SwingWorker.setProgress()函数的边界为0和100,因此即使ProgressMonitor
可以处理更高的最大值,SwingWorker
线程也会以IllegalArgumentException
结束。价值达到101。