我在编写/更新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);
}
}
答案 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