java - 为什么 jTextArea.setText() 方法在它应该之后才起作用?

标签 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 已成功散列!!”

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

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

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

最佳答案

Note: The only thing that came to my mind is to use thread, could it solve the problem?

是的,这是正确的。在事件监听器中执行的代码在事件调度线程上调用。在所有代码执行完毕之前,无法重新绘制 GUI。因此,长时间运行的任务会阻止 GUI 重新绘制自身。

阅读 Swing 教程中关于 Concurrency in Swing 的部分了解更多信息。也许 SwingWorker 将是比创建自己的线程更好的解决方案。

关于java - 为什么 jTextArea.setText() 方法在它应该之后才起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23478387/

相关文章:

java - 如何在 android studio 中调用已编译的 jar 文件的 java 类?

java - 安卓错误 "The application may be doing too much work on its main thread"

java swing jtable 单元格渲染器组件的屏幕位置

java - I/O 上的事件处理

php - 使用 while 和 if 组合比较 mysql/php 中两个表的值

java - 字符串性能-内存

java - 无法添加两个 JTabbedPane

java - 如何在 Java Swing 中监听 JFrame 窗口从其父 JFrame 关闭

mysql - 将变量发送到下一页而不覆盖

c++ - 可以在循环中使用相同的变量名吗?