2011-11-02 45 views
0

我正在写一个java应用程序,通过DES算法加密和解密输入。首先,我在没有GUI的情况下制作了它,并使用System.out.print();在输出窗口中打印了中间步骤。当输入较大时,计算可能需要一段时间,但是当使用输出窗口时,中间步骤将在计算时逐一打印。那很完美。在java中打印中间步骤冻结

现在我由GUI我的程序,使用一个JTextArea,称为txtDebug用于打印的中间步骤:

public static void debug(String tekst){ 
txtDebug.setText(txtDebug.getText()+tekst+"\n");} 

问题:中间步骤不打印逐个了。如果输入量很大,程序就会冻结并不执行任何操作,直到计算全部完成,然后一次打印所有中间步骤。

另一个问题:当我没有使用GUI时,程序从未崩溃,现在如果输入足够大,程序崩溃:它冻结,永远不会回到生活。

请帮忙吗?

回答

2

您必须在后台工作线程中完成这项工作。在主线程中执行它将阻​​止Swing处理事件 - > UI将被阻止。

+0

感谢您的回复,我已阅读了SwingWorker,但我不确定如何实现它,这是我的程序的结构:我有一个Functions.java,其中包含用于加密的所有函数以及解密,2个类Encryption.java和Decryption.java,他们从Functions.java调用正确的函数,并且我有一个Main.java类,它包含GUI和actionhandlers并调用Encrypt.java或Decrypt.java。我还在Main.java中添加了一个函数,以便Encrypt.java和Decrypt.java可以将调试信息写入txtDebug。哪些类需要扩展SwingWorker? – user1026090

+0

无; SwingWorker是一个实用程序类。请参阅JavaDocs中的示例(我的答案中的第二个链接)。请参阅http://download.oracle.com/javase/tutorial/uiswing/concurrency/interim.html –

+0

谢谢,我现在使用我的Encrypt类中的SwingWorker在后台进行计算,并在计算完成后,打印我的GUI中的中间步骤。现在还有一个问题:没有GUI,我的程序计算速度非常快,大约每秒100次迭代。使用GUI和SwingWorker,我的程序每秒只能计算一次迭代。这怎么发生的? – user1026090

2

用户界面冻结,因为你在事件指派线程,该线程负责处理事件,并重绘UI进行长时间运行的计算。为避免此问题,请考虑在后台线程上执行加密/解密,可能使用SwingWorker

关于用户界面的第二点永不复发,这可能表明另一个资源问题(例如内存)。发生此问题时,您可能需要运行Profiler或JConsole来查看每个线程的状态。

+0

感谢您的回复,我已阅读了SwingWorker,但我不确定如何实现它,这是我程序的结构:我有一个Functions.java,其中包含用于加密和解密的所有函数, 2类Encryption.java和Decryption.java,它们从Functions.java调用正确的函数,并且我有一个Main.java类,它包含GUI和Actionhandlers并调用Encrypt.java或Decrypt。java的。我还在Main.java中添加了一个函数,以便Encrypt.java和Decrypt.java可以将调试信息写入txtDebug。哪些类需要扩展SwingWorker? – user1026090