java - Java Swing 中的错误的publish()/process()交互

标签 java swing swingworker

我正在用 java 编写在线视频游戏。我已经完成了服务器,现在我要开始客户端了。 我的问题出在套接字监听器代码中的某个地方,这是一个 swingworker 子类,其工作是监听服务器(doInBackGround())并根据需要更新游戏 map 。

代码如下:

import javax.swing.*;
import java.util.List;

public class GameWorker extends SwingWorker<Void, String> {

    private SocketStreamsBean streams;
    private GameFrame game;

    public GameWorker(SocketStreamsBean streams, GameFrame game) {
        this.streams = streams;
        this.game = game;
    }

    @Override
    protected Void doInBackground() throws Exception {
        for(String msg = streams.getIn().readLine(); msg != null; msg = streams.getIn().readLine()){
            System.out.println("bp "  + msg + " " + Thread.currentThread().getId());//TODO remove
            publish(msg);
            System.out.println("ap "  + msg + " " + Thread.currentThread().getId());//TODO remove
        }
        return null;
    }

    @Override
    protected void process(List<String> list) {

        for(String msg = list.remove(0); list.size() != 0; msg = list.remove(0)) {
            System.out.println("dp "  + msg + " " + Thread.currentThread().getId());//TODO remove
            String[] cmds = msg.split(":");
            switch (cmds[0]) {
                case "ADD":
                    game.add(cmds[1], cmds[2], cmds[3]);
                    break;
                case "MOVE":
                    game.remove(cmds[1]);
                    game.add(cmds[1], cmds[2], cmds[3]);
                    break;
                case "REMOVE":
                    game.remove(cmds[1]);
                    break;
                case "BULLETS":
                    //game.addBullets(cmds[1]);
            }
        }
        list.clear();
    }
}

根据三个调试 println(),当玩家移动并且服务器将其广播到所有客户端时,消息被读取并发布但从未被处理。怎么可能?

最佳答案

您在 for 循环中两次从列表中删除消息 - list.remove(0):

for(String msg = list.remove(0); list.size() != 0; msg = list.remove(0))

这是迭代列表的简单方法:

for(String msg : list){
    System.out.println(msg);
}

关于java - Java Swing 中的错误的publish()/process()交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45885588/

相关文章:

java - Spring 使用 JPA 和 Hibernate 时出错

java - 甚至没有使用的 ImageIcon 正在影响我的 JFrame/JPanel。为什么?

java - 使添加的 JPanel 在父 JPanel 中可见

java - SwingWorker 在完成工作后设置标志

java - 启动 swing 应用程序的最佳实践

java - 如何在 pdf 文件内容中搜索并附加到电子邮件

Java 7 并行执行并未使用倒计时锁存器提高 REST API 的性能

java - Java GUI 中的图片更改

java - SwingWorker 与 FileVisitor 无法快速发布处理后的信息;图形用户界面挂起

java - JSF 2 - 未检测到@ManagedBean