在while循环中更新jTextArea

时间:2015-06-15 09:01:22

标签: java swing while-loop jtextarea updating

我在编写/更新textarea时遇到问题。我从readtemp函数获取一个值,我可以在调用system out函数后看到结果,但Textarea中没有任何内容。可能是什么问题?

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);
    }
}                                        

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

你是否在单独的线程中执行IO和图形,因为它应该完成?您应该只在事件派发线程中更新UI,因此当从外部位置检索结果已完成时,您将更新提交到事件派发线程。

答案 2 :(得分:0)

由于无限循环while (true),问题存在。因为函数jButton1ActionPerformed永远不会结束,所以Swing没有机会重新呈现jTextArea1组件(我假设在AWT线程中调用此方法)。

答案 3 :(得分:0)

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

Java 8方式:

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

Pre-Java 8:

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

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