对不起大家也许这可能是一个愚蠢的问题,但实际上我找不到类似的情况。
这是我的代码:
private void startHashingButtonActionPerformed(java.awt.event.ActionEvent evt) {
consoleArea.setText( myFile.getName() + " started to be hashing! It can take few minutes, please wait.."); //20:05
try {
BufferedReader reader = new BufferedReader(new FileReader(myFile));
myHash = new HashOA(300000);
try {
while(reader.readLine() != null){
myHash.hash(reader.readLine());
}
consoleArea.append("\n" + myFile.getName() + " is successfully hashed!!");
} catch (IOException ex) {
Logger.getLogger(MainScreen.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (FileNotFoundException ex) {
Logger.getLogger(MainScreen.class.getName()).log(Level.SEVERE, null, ex);
}
}
我希望在consoleArea(TextArea)中应该有" file.txt开始散列!可能需要几分钟,请稍候.."写入之后,应该启动散列过程(while(reader.readLine()!= null)循环)。但是当我运行程序并点击" startHashingButton"它首先完成散列过程,然后在控制台上写入(jTextArea) - > " file.txt开始散列!可能需要几分钟,请稍候.."," file.txt已成功哈希!!"
我正在处理大型文本文件,并且需要一段时间才能对其进行哈希处理。这就是为什么我想告诉用户他/她应该等一下。
为什么工作队列与我的代码顺序不同?
注意:我唯一想到的就是使用线程,它可以解决问题吗?
答案 0 :(得分:1)
注意:我唯一想到的就是使用线程,它可以解决问题吗?
是的,这是正确的。在Event Dispatch Thread上调用在事件侦听器中执行的代码。 GUI不能重新绘制,直到所有代码完成执行。因此,长时间运行的任务会阻止GUI重新绘制自己。
阅读Concurrency in Swing上Swing教程中的部分以获取更多信息。也许SwingWorker
比创建自己的Thread更好。
答案 1 :(得分:0)
使用SwingWorker实现工作线程。 在doInBackground方法中执行所有处理,您可以在doInBackground中添加以下代码。在此之前,您可以在控制台区域中设置文本。一旦对文件进行了哈希处理,就可以实现done()方法并在控制台区域中设置相应的消息。为了给你一个想法,它看起来像这样
@Override
protected Integer doInBackground() throws Exception {
try {
BufferedReader reader = new BufferedReader(new FileReader(myFile));
myHash = new HashOA(300000);
try {
while(reader.readLine() != null){
myHash.hash(reader.readLine());
}
return null;
} catch (IOException ex) {
Logger.getLogger(MainScreen.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (FileNotFoundException ex) {
Logger.getLogger(MainScreen.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
protected void done() {
consoleArea.append("\n" + myFile.getName() + " is successfully hashed!!");
}
请参阅此内容以获得更清晰:How do I make my SwingWorker example work properly?