为什么jTextArea.setText()方法应该工作呢?

时间:2014-05-05 17:38:15

标签: java swing while-loop jtextarea

对不起大家也许这可能是一个愚蠢的问题,但实际上我找不到类似的情况。

这是我的代码:

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已成功哈希!!"

我正在处理大型文本文件,并且需要一段时间才能对其进行哈希处理。这就是为什么我想告诉用户他/她应该等一下。

为什么工作队列与我的代码顺序不同?

注意:我唯一想到的就是使用线程,它可以解决问题吗?

2 个答案:

答案 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?