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

时间:2012-09-15 16:14:03

标签: java multithreading swingworker

我在SwingWorker中有一个ServerSocketChannel连接过程。在Swing应用程序本身中,两个JLabel应该更新为(1)一个String(连接状态)和(2)一个int(连接的客户端数)。下面是“检测客户端”之前应用程序的屏幕截图JButton运行连接过程。但是,我不知道如何发布()和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 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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
}

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

请告诉我,如果我没有正确理解您,因为我有预感,您可能需要PropertyChangeListeners参与此处。