在 while 循环中更新 jTextArea

Updating jTextArea in while loop

我有一个问题 writing/updating textarea。我正在从 readtemp 函数中获取一个值,在调用系统输出函数后我可以看到结果,但文本区域中什么也没有出现。可能是什么问题?

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    URL temp;
    try 
    {
            temp = new URL("http://192.168.1.25/status.xml");
            while (true)
            {
                System.out.println("Homerseklet: " + readtemp(temp));
                jTextArea1.append(readtemp(temp));
            }                   
    } 
    catch (MalformedURLException ex) 
    {
        Logger.getLogger(Download.class.getName()).log(Level.SEVERE, null, ex);
    }
}                                        

您是否按预期在单独的线程中处理 IO 和图形?您应该只在事件调度线程中进行更新 UI,因此当从外部位置检索结果完成后,您将更新提交给事件调度线程。

问题存在是因为无​​限循环while (true)。因为函数 jButton1ActionPerformed 永远不会结束,Swing 没有机会重新渲染 jTextArea1 组件(我假设这个方法是在 AWT 线程中调用的)。

更正:这无济于事,因为无限循环仍将永远阻止 EDT...没关系!

你的 while 循环是一个 非常糟糕的主意,但如果你坚持,你至少可以让 EDT 有机会通过调度你的追加来更新 UI异步:

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        jTextArea1.append(readtemp(temp));    
    }
});

如前面的答案所述,在 swing 线程内处理长 运行 操作不是一个好主意。作为解决方案,我将用以下代码片段替换您的 "textfield.append()"- 行:

Java 8路:

SwingUtilities.invokeLater(() -> jTextArea1.append(readtemp(temp)));

前Java 8:

 SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        jTextArea1.append(readtemp(temp));
    }
 });

来源和一些解释:https://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html