java - 如何在 SwingWorker 中构建publish() 和 process() 来更新 EDT 上的多个 Swing 组件?

标签 java multithreading swingworker

我在 SwingWorker 中有一个 ServerSocketChannel 连接进程。在 Swing 应用程序本身中,两个 JLabel 应使用 (1) String(连接状态)和 (2) int(连接的客户端数量)进行更新。下面是“检测客户端”JButton 运行连接过程之前的应用程序屏幕截图。然而,我不确定如何使用publish()和process()来更新EDT上的多个Swing组件。有人指导如何实现这一目标吗?

ScreenShot

因为List<V>是process()的参数,我试过<Object><V> 。然而,这似乎遇到了从字符串/整数到对象的转换问题,反之亦然。

下面的演示代码说明了应发布更新的几个要点:

protected Void doInBackground() {
    try {
       // Omitted: obtain selector
       ServerSocketChannel ssc = ServerSocketChannel.open() // could fail, may need
       // to publish status
       ssc.socket().bind(serverAddress); // could fail, may need to publish status
       ssc.configureBlocking(false); // could fail, may need to publish status
       // Omitted: register ssc
       while (true) {
           int count = sel.select(1000); // may need to publish for # of clients
           // Omitted: rest of processing     
       }
    } catch (IOException e) {
        //handle error
    } 
}

最佳答案

啊,现在我明白你的问题了。您正在尝试发布 2 条不同的信息。请注意,传递到 process() 方法的 List 可能包含多个 publish() 调用的结果,因此传递不同类型的值将对您的 process() 方法感到困惑。相反,您应该创建一个简单的对象来封装您希望传递的所有状态,并始终发布该类的实例(这也将解决您的所有转换问题)。例如:

public class ChannelStatus {
  public final boolean active;
  public final int numClients;
}

然后,您始终会发布一个具有当前客户端数量和“Activity ”状态的 ChannelStatus 实例。

关于java - 如何在 SwingWorker 中构建publish() 和 process() 来更新 EDT 上的多个 Swing 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12439005/

相关文章:

java - Maven自定义包装

java thread.sleep() 在我测试时不让处理器时间可供其他线程使用

java - Swing GUI 不更新

java - SwingWorker 中的线程安全 - 以线程安全的方式更新 JTable

java - xpath表达式中如何使用逻辑运算符

java - Spring - 在 xml 中获取系统环境变量会导致空指针异常

java - 应用程序在添加第二个navHostFragment时崩溃

Java - SQL 和线程 - 处理卡住

java - 当两个线程尝试修改/访问 Concurrenthashmap 中的同一个键时会发生什么?

java - 取消周转 worker 的问题