0

我在 SwingWorker 中有一个 ServerSocketChannel 连接进程。在 Swing 应用程序本身中,两个 JLabel 应该更新为 (1) 字符串(连接状态)和 (2) 整数(连接的客户端数)。下面是“检测客户端”JButton 运行连接过程之前应用程序的屏幕截图。但是,我不确定如何发布()和处理(),以便在 EDT 上更新多个 Swing 组件。有人对如何实现这一目标有指导吗?

截屏

因为List<V>是 process() 的参数,所以我试<Object>了 as <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
    } 
}
4

2 回答 2

4

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

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

然后,您将始终发布具有当前客户端数量和“活动”状态的 ChannelStatus 实例。

于 2012-09-15T17:25:23.933 回答
1

您可以使用 String 作为结果类型。说,对于一个整数(客户数量)做publish(String.valueOf(integer)),然后在你的process()方法中尝试类似

try {
 int numClients = Integer.parseInt(passedString);
 //all well, it's the client number
} catch(NumberFormatException ex) {
 //not a number, must be a connection status
}

或者简单地将这两个信息用适当的 getter 包装在一个单独的类中setNumClients, setConnStatus,随着您的进展填充它,然后发布该类的对象。

如果我没有正确理解您,请告诉我,因为我有一种预感,您可能希望PropertyChangeListeners参与其中。

于 2012-09-15T16:45:15.697 回答