1

いくつmethodかの印刷を行う があり、大きなファイルを作成している可能性があり、長いプロセスで GUI をフリーズさせたくないため、タスクを (EDT ではなく) 別のスレッドで実行したいと考えています。実行は EDT で完全に機能します (もちろん、GUI はフリーズしますが、これは望ましくありません) が、別のスレッドで呼び出された場合は実行されません。
メソッドは次のとおりです。

                    buildReceipt(itemList, method);

どこ;

  • itemListレシートの入力に使用される ArrayList であり、
  • methodenum出力を .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;
}
4

1 に答える 1