我的程序是无限地 ping 主机并在 GUI 上将每个 ping 结果显示为红色/绿色。这里,“res”是一个标签,它根据 ping 结果更改其文本和背景。
问题是,当我使用 while() 时,GUI 变得无响应,并且标签的颜色不会更改,而 ping 服务仍在继续。我该如何解决这个问题?
while (true) {
try {
boolean status = InetAddress.getByName(host).isReachable(timeOut);
if (status == true) {
res.setText("ON");
res.setBackground(Color.GREEN);
} else {
res.setText("OFF");
res.setBackground(Color.RED);
}
} catch (IOException ex) {
}
最佳答案
首先查看 Concurrency in Swing
本质上,根据您的描述,您正在阻止事件调度线程,阻止它处理新事件,包括绘制事件。
Swing 也不是线程安全的,这意味着您不应该从 EDT 上下文之外更新 UI。
在这种情况下,您可以使用 SwingWorker
在 doInBackground
方法中执行物理“ping”,并使用 publish
>/process
方法来更新 UI。
参见Worker Threads and SwingWorker了解更多详情
关于java - 使用 InetAddress 多次 Ping 导致 GUI 无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30882122/