我是 Java Swing 的新手,我需要制作一些简单的 Java 桌面应用程序。 我有 MainPanel,其中我有 SwingWorker 和 doInBackgroung,我在其中调用服务,该服务调用 DAO 从数据库中查询数据。我还有一个停止按钮,点击它设置 worker.cancel(true),但程序没有停止,我什至不能用 X 按钮关闭窗口。 我想处理并没有立即停止,因为对数据库的查询还没有结束,但为什么我不能关闭窗口?
这是代码:
worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
long startTime = System.nanoTime();
textArea.append("Starting...\n");
generatingFilesService.genereteFiles(connectionDBFirst, connectionDBSecond, connectionDBThird,
date1, date2);
long endTime = System.nanoTime();
double time = (double) ((endTime - startTime) / 1_000_000_000);
if (ConnectionDBFirst.flag != false) {
if (time < 60d) {
textArea.append("Genereting ended for " + time + " seconds\n");
textArea.setCaretPosition(MainPanel.textArea.getDocument().getLength());
} else {
textArea.append("Genereting ended for " + (time / 60) + " minutes\n");
textArea.setCaretPosition(MainPanel.textArea.getDocument().getLength());
}
}
return null;
}
@Override
protected void done() {
if (isCancelled()) {
textArea.append("Stopping generating files...\n");
closeConnections();
logger.info(Messages.PROCCESS_INTERUPTED);
} else
closeConnections();
}
};worker.execute();
停止代码:
if (e.getSource() == stop) {
worker.cancel(true);
stop.setEnabled(false);}
您正在从 doInBackground 方法中进行 Swing 突变调用:
textArea.append(...);
这打破了线程规则和你的程序。
解决方案是不这样做,而是
publish
需要显示的数据,然后process
通过SwingWorker的publish/process方法对发布的信息。
例如,(代码未测试):
worker = new SwingWorker<Void, String>() {
@Override
protected Object doInBackground() throws Exception {
long startTime = System.nanoTime();
// textArea.append("Starting...\n");
publish("Starting...\n");
generatingFilesService.genereteFiles(connectionDBFirst, connectionDBSecond, connectionDBThird, date1, date2);
long endTime = System.nanoTime();
double time = (double) ((endTime - startTime) / 1_000_000_000);
if (ConnectionDBFirst.flag != false) {
if (time < 60d) {
// textArea.append("Genereting ended for " + time + " seconds\n");
// textArea.setCaretPosition(MainPanel.textArea.getDocument().getLength());
publish("Genereting ended for " + time + " seconds\n");
} else {
// textArea.append("Genereting ended for " + (time / 60) + " minutes\n");
// textArea.setCaretPosition(MainPanel.textArea.getDocument().getLength());
publish("Genereting ended for " + (time / 60) + " minutes\n");
}
}
return null;
}
@Override
protected void process(List<String> chunks) {
for (String chunk : chunks) {
textArea.append(chunk);
textArea.setCaretPosition(MainPanel.textArea.getDocument().getLength());
}
}
// ....
}
worker.execute();