いくつmethod
かの印刷を行う があり、大きなファイルを作成している可能性があり、長いプロセスで GUI をフリーズさせたくないため、タスクを (EDT ではなく) 別のスレッドで実行したいと考えています。実行は EDT で完全に機能します (もちろん、GUI はフリーズしますが、これは望ましくありません) が、別のスレッドで呼び出された場合は実行されません。
メソッドは次のとおりです。
buildReceipt(itemList, method);
どこ;
itemList
レシートの入力に使用される ArrayList であり、method
enum
出力を .pdf ファイルにするか、プリンターに直接送信するかを決定するタイプです。
上記のコードは、EDT で実行すると適切にドキュメントを生成しますが、 のdoInBackground()
メソッドを使用してバックグラウンド タスクにしようとすると、SwingWorker
まったく何もしませんでした。それから私は興味を持って、次のことを試しました。
Thread thread = new Thread(new Runnable(){
@Override
public void run()
{
buildReceipt(itemList, method);
}
});
thread.start();
それでも、何も起こらなかった....もっと面白くて紛らわしいのは、SwingUtilities.InvokeLater
&を試してみSwingUtilities.InvokeAndWait
た (これは EDT で実行されたドキュメントによる) が、それでも役に立たなかったという事実です。
スタックオーバーフロー関連の質問をできる限り検索しましたが、奇妙な問題に対処するものはありません。私は本当にこれについて助けが必要です。昨日から立ち往生?!?!?!
編集:
ジーン・ワゲッティに敬意を表して。内部で何が起こっているかを簡単に説明します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;
}