日期:2014-05-20  浏览次数:20806 次

如何使用SwingWorker类来实现界面实时强制自动刷新???
如题。我的基本问题是这样的:现在我开发了一个简单扼微博系统,在客户端是用java swing写的简单界面。服务器没界面。
某个基本功能是查看自己的粉丝对象。先假设A客户端原先没有关注B客户端,所以在B那里是不会显示B有粉丝A的。现在A增加一个关注对象B,我现在可以使A客户端的界面即时自动更新显示A有一个关注对象B,但是B端必须通过我在界面上设置的一个更新按钮去手动刷新自己的粉丝列表。
我想实现的效果是:B端的粉丝列表能够自动实时更新,不一定需要B手动点击更新按钮。

问题:
1、
初步设想使用SwingWorker,但是没有思路?需要在客户端怎么和服务器交互,才能使SwingWorker的doInBackground方法即时获取最新的粉丝对象信息呢?
2、
若不是采用SwingWorker,还有其他什么的解决方案?
急待各位指点迷津,谢谢!

------解决方案--------------------
引用:
引用:引用:引用:引用:引用:[Client A] --call--> [Server] --single.cast--> [Client B] --edt.sync--> [GUI]
[Client A……



呃,这么说吧,我觉得你这里关键的时间点是在

“客户端建立到服务器端的socket连接”的时候。

而这件事一般不是在UI线程中进行的,虽然它可能是点击某个按钮引起的。

比如,你有一个“连接”按钮,在它的 ActionListener 里可能有类似:


public void actionPerformed(ActionEvent e) {
  
  // disable 界面

  new SwingWorker<Void, Void>() {
    
    @Override
    protected Void doInBackground() {
      
      connectServer(); // 这里建立socket连接
      return null;
    }
    
    @Override
    protected void done() {
      
      // enable 界面
    }
  }.execute();
}


而在那个 connectServer 方法中,你建立了socket连接以后,可以起一个专门的线程,这个线程只做一件事,就是反复从socket.getInputStream() 中读取消息。读取的消息可以再交给一个专门分析消息的东西分析,分析完以后用 SwingUtilities.invokeLater() 的方式更新界面。

这个专门读取 socket 输入流的线程,普通的 Runnable 就可以了,没有必要非得是 SwingWorker。