我有一个method
做一些打印的任务,我希望任务在另一个线程(而不是 EDT)上运行,因为它可能正在创建一个大文件,我不希望长时间的过程冻结 GUI。执行在 EDT 上完美运行(当然 GUI 冻结 - 这是不希望的),但是当在不同的线程上调用时,它只是不执行。
方法来了;
buildReceipt(itemList, method);
在哪里;
itemList
是一个用于填充收据的 ArrayList,并且method
是一种enum
类型,用于确定是将输出设为 .pdf 文件还是将其直接发送到打印机
doInBackground()
上面的代码在 EDT 上执行时可以很好地生成文档,但是当我尝试使用of 方法使其成为后台任务时SwingWorker
,它根本没有做任何事情;然后我很好奇并尝试了以下方法;
Thread thread = new Thread(new Runnable(){
@Override
public void run()
{
buildReceipt(itemList, method);
}
});
thread.start();
仍然没有发生任何事情............更有趣和令人困惑的是我什至尝试过SwingUtilities.InvokeLater
& SwingUtilities.InvokeAndWait
(根据文档在 EDT 上运行)但仍然无济于事。
我已经尽可能多地搜索了与 Stack Overflow 相关的问题,但没有一个能解决我的奇怪问题。我真的需要这方面的帮助。从昨天开始就卡住了?!?!?!
编辑:
回应让·瓦盖蒂;这里简要介绍一下里面发生的事情buildReceipt
private boolean buildReceipt(ArrayList<Sales> itemList, PrintMethod method)
{
boolean built = false;
if(!itemList.isEmpty())
{
InvoiceDesign design = new InvoiceDesign(itemList);
try
{
JasperReportBuilder report = design.build();
if(method.equals(PrintMethod.PDF))
{
appManager.connectToDB();
File fileDir = appManager.getReceiptsDir();
appManager.disconnectDB();
FileOutputStream fos = new FileOutputStream(fileDir);
report.toPdf(fos);
fos.close();
built = true;
}
else if(method.equals(PrintMethod.PRINTER))
{
report.print(true);
built = true;
}
}
catch(IOException e)
{
e.printStackTrace();
}
catch (DRException e)
{
e.printStackTrace();
}
}
return built;
}