java - 实时输出到jTextArea

标签 java user-interface refresh real-time jtextarea

我有一些代码需要几分钟来处理,它必须为长数组中的每个字符串连接到网络,每个字符串都是一个 url。我想让它每次连接时都应该刷新 jtextarea,这样用户就不会盯着看起来卡住 20 分钟的空白页面。或者需要多长时间。这是我尝试过但没有奏效的示例:

try {
            ArrayList<String> myLinks = LinkParser.getmyLinksArray(jTextArea1.getText());
            for (String s : myLinks) {
                jTextArea2.append(LinkChecker.checkFileStatus(s) + "\n");
            }
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(jTextArea1, "Parsing Error", "Parsing Error", JOptionPane.ERROR_MESSAGE);
            Logger.getLogger(MYView.class.getName()).log(Level.SEVERE, null, ex);
        }

最佳答案

问题是您需要异步执行计算。您应该创建一个执行计算的后台线程,然后使用 SwingUtilities.invokeLater更新 JTextArea。

final ArrayList<String> myLinks = //...
(new Thread()
{
    public void run(){
        for (String s : myLinks) {
            try{
               final String result = LinkChecker.checkFileStatus(s) + "\n";
               SwingUtilities.invokeLater(new Runnable(){ 
                    public void run(){    
                      jtextArea2.append(result);
                    }
                });
             }catch(IOException error){
                // handle error
             }
        }
    }
}).start();

编辑
已经指出 JTextArea 的附加函数实际上是线程安全的(与大多数 Swing 函数不同)。因此,对于这种特殊情况,没有必要通过 invokeLater 更新它。但是,您仍然应该在后台线程中进行处理,以便让 GUI 更新,所以代码是:

final ArrayList<String> myLinks = //...
(new Thread()
{
    public void run(){
        for (String s : myLinks) {
            try{
               jtextArea2.append(LinkChecker.checkFileStatus(s) + "\n");
             }catch(IOException error){
                // handle error
             }
        }
    }
}).start();

但是,对于几乎所有其他修改 Swing 对象的操作,您都需要使用 invokeLater(以确保修改发生在 GUI 线程中),因为几乎所有 Swing 函数都不是线程安全的。

关于java - 实时输出到jTextArea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2710712/

相关文章:

java - XMLEncoder 无法正确写入文件

java - 在 Java 中使用 Regex 验证文本和数字格式

java - 隐式 super 构造函数 Seat() 未定义。必须显式调用另一个构造函数

c++ - Win32 的用户界面控件

javascript - 如何在 facebook 中的 javascript 中重新加载/刷新事件页面?

java - 使用 POI 在 Excel 中打开报告,浏览器保持不变

java - 列表显示面板无法正常工作

java - 在java中检索并以GUI形式显示Mysql表的不同行

c# - 如何阻止事件触发 + ASP.NET

php - 在 php 中使用元刷新标签进行重定向而不是 header() 函数是一种好习惯吗?