在 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
我有一个问题 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