我在SwingWorker中有一个ServerSocketChannel连接过程。在Swing应用程序本身中,两个JLabel应该更新为(1)一个String(连接状态)和(2)一个int(连接的客户端数)。下面是“检测客户端”之前应用程序的屏幕截图JButton运行连接过程。但是,我不知道如何发布()和process()以便在EDT上更新多个Swing组件。有没有人有关于如何实现这一目标的指导?
由于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
}
}
答案 0 :(得分:4)
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
参与此处。