java - 使用 InetAddress 多次 Ping 导致 GUI 无响应

标签 java netbeans ping inetaddress

我的程序是无限地 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。

在这种情况下,您可以使用 SwingWorkerdoInBackground 方法中执行物理“ping”,并使用 publish >/process 方法来更新 UI。

参见Worker Threads and SwingWorker了解更多详情

关于java - 使用 InetAddress 多次 Ping 导致 GUI 无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30882122/

相关文章:

c - 将 ping 命令的输出写入 c 中的文本文件的问题?

java - IntelliJ Maven 与普通 Maven

java从时间戳中删除时区偏移

java - 包装 jframe

java - NetBeans 未生成 javaDoc 的 @author 和 @version?

java - 小便器算法 - 一个简单的优化

java - 无法将 Java RESTful Web 服务教程中所示的库导入到我的 NetBeans 项目中

networking - 如何在 VirtualBox 上 ping ubuntu guest

eclipse - 指向 eclipse IDE 以使用 JAVA_HOME 中指定的 JRE/JDK 之外的另一个 JRE/JDK

Java 套接字服务器客户端场景