Java 丢失ArrayList条目时出现的问题

Java 丢失ArrayList条目时出现的问题,java,serialization,arraylist,Java,Serialization,Arraylist,我目前正在为Java课程的最后一个项目设计一个图形游戏。它使用基本的回显服务器将数据从发送方回显到接收方。每个GUI都有自己的DrawCanvas,但只有艺术家可以画画,其他人都可以观看 画布的所有数据都存储在ArrayList中,一个用于线条,一个用于颜色,一个用于线条厚度。当数据被发送时,它被打包成一个信封并发送到服务器 信封类本质上是(字符串键、对象数据),因此您可以使用字符串标识信封,并在另一端解包数据 多个客户端可以毫无问题地观看艺术家的绘画。艺术家画布连续向其他客户端发送点(通过se

我目前正在为Java课程的最后一个项目设计一个图形游戏。它使用基本的回显服务器将数据从发送方回显到接收方。每个GUI都有自己的DrawCanvas,但只有艺术家可以画画,其他人都可以观看

画布的所有数据都存储在ArrayList中,一个用于线条,一个用于颜色,一个用于线条厚度。当数据被发送时,它被打包成一个信封并发送到服务器

信封类本质上是(字符串键、对象数据),因此您可以使用字符串标识信封,并在另一端解包数据

多个客户端可以毫无问题地观看艺术家的绘画。艺术家画布连续向其他客户端发送点(通过sendStartPoint()和sendPoint()),这些客户端被重新构建到另一端的画布中。但是,如果客户机在绘制对象后加入,则需要使用所有画布数据更新它们,否则它们将只看到加入后添加的内容。为此,使用sendCanvas()和loadCanvas()方法

我遇到的问题是,即使sendCanvas()发送所有数据,客户端也只接收绘制的第一行的数据

除了下面发布的DrawCanvas类中的内容之外,这是唯一的其他数据处理——信封在这里被解包

如果有帮助的话,我可以发布更多其他类的代码

仅对信封进行其他处理

if(e.getKey().equals(“draw”)){
ArrayList data=(ArrayList)e.getData();
ArrayList lines=(ArrayList)data.get(0);
ArrayList colors=(ArrayList)data.get(1);
ArrayList厚度=(ArrayList)data.get(2);
绘制(线条、颜色、厚度);
}
DrawCanvas

private ArrayList line=new ArrayList();
private ArrayList colorList=new ArrayList();
私有ArrayList thicknessList=新ArrayList();
私有颜色=Color.BLACK;
厚度=3;
私人聊天室;
MouseAdapter ma;
{//鼠标侦听器块
ma=新的MouseAdapter(){
公共无效鼠标按下(MouseEvent e){
addLine();
get(lines.size()-1).add(e.getPoint());
//sendCanvas();
sendStartPoint();
重新油漆();
}//结束鼠标按下
公共无效MouseEvent(MouseEvent e){
get(lines.size()-1).add(e.getPoint());
//sendCanvas();
sendPoint();
重新油漆();
}//结束鼠标滑动
公共无效鼠标标记(鼠标事件e){
get(lines.size()-1).add(e.getPoint());
//sendCanvas();
sendPoint();
重新油漆();
}//结束鼠标标记
};
}//结束鼠标侦听器块
//存储构建整个画布所需的所有数据
公共void loadCanvas(ArrayList换行符、ArrayList新颜色、ArrayList新厚度){
System.out.println(“接收画布”);
this.lines=换行符;
this.colorList=newColors;
this.thicknessList=新厚度;
重新油漆();
}
//发送构建整个画布所需的所有数据
公共void sendCanvas(int id){
System.out.println(“发送画布”);
ArrayList temp=新的ArrayList();
温度添加(行);
临时添加(颜色列表);
温度添加(厚度列表);
临时添加(id);
试一试{
sendToServer(新信封(“draw”,temp));
}捕获(IOE1异常){
System.out.println(“发送画布时出错”);
}
}
//向保留点添加新的空行,更新属性
公共void addLine(){
添加(新的ArrayList());
颜色列表。添加(颜色);
厚度列表。添加(厚度);
}

我已设法使我的程序正常运行。它并没有提供一些数据为什么不被传输的答案,只是接受它作为事实并围绕它工作

正如您在下面看到的,我更改了sendCanvas()方法,将每一行发送到它自己的信封中

public void sendCanvas(int id){
    for (int i = 0; i < lines.size(); i++){
        System.out.println("SENDING CANVAS " + i);
        ArrayList<Object> temp = new ArrayList<Object>();
        temp.add(lines.get(i));
        temp.add(colorList.get(i));
        temp.add(thicknessList.get(i));
        temp.add(id);
        try {
            chat.sendToServer(new Envelope("draw", temp));
        } catch (IOException e1) {
            System.out.println("Error sending canvas");
        }
    }
public void sendCanvas(int-id){
对于(int i=0;i
我没有让DrawCanvas使用loadCanvas()重建它,而是更新了现有的addLine()方法,如下所示:

public void addLine(ArrayList<Point> line, Color c, int t){
    lines.add(line);
    colorList.add(c);
    thicknessList.add(t);
    repaint();
}
public void addLine(数组列表行,颜色c,int t){
行。添加(行);
颜色列表。添加(c);
厚度列表。添加(t);
重新油漆();
}

我知道这可能不是解决此问题的最佳方法,但我的日程安排很紧,而且它可以工作。

应该发生的是,整个ArrayList应该保存在第一个数据索引中。如果您查看“sendCanvas”在DrawCanvas中,ArrayList temp正在存储所有这些数据,这些数据在另一个类中使用data作为名称删除。如果您可以发布更少的代码,而不是更多的代码,这会更好。您可以创建一个吗?我们只需要查看直接导致问题的代码。查看是否可以删除其余的数据,即使最终程序没有任何用处l、 重要的是你有一个小程序,它能做一些你不期望的事情。@JohnKugelman我删减了代码,只是为了显示重要的方法。我不认为其他任何事情会影响结果,除非序列化和反序列化数据可能会产生一些影响。@GeoDude,你已经在这方面取得了一些进展“最小”部分,但您似乎没有完全掌握“完整”和“可验证”部分。我们不想要代码的精简版本;我们想要演示相同问题的尽可能最小的程序。感谢您的编辑,这是一个d