我在 SwingWorker 中有一个 ServerSocketChannel 连接进程。在 Swing 应用程序本身中,两个 JLabel 应使用 (1) String(连接状态)和 (2) int(连接的客户端数量)进行更新。下面是“检测客户端”JButton 运行连接过程之前的应用程序屏幕截图。然而,我不确定如何使用publish()和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
}
}
最佳答案
啊,现在我明白你的问题了。您正在尝试发布 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/