丢失ArrayList条目的问题

时间:2016-02-20 02:46:52

标签: java serialization arraylist

我目前正在Java课程中为我的最终项目设计Pictionary游戏。它使用基本的Echo Server来回送从发送方到接收方的数据。每个GUI都有自己的DrawCanvas,但只有艺术家才能绘制,其他人都会观看。

画布的所有数据都存储在ArrayLists中,一个用于行,一个用于颜色,一个用于行粗细。发送数据时,将其打包到信封中并发送到服务器。

Envelope类本质上是(String key,Object data),因此您可以使用字符串对信封进行ID识别,并在另一端解包数据。

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

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

除了下面发布的DrawCanvas类中的内容之外,这是唯一的其他数据处理 - 信封未打包。

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

仅限信封的其他处理

if (e.getKey().equals("draw")){
    ArrayList<Object> data = (ArrayList<Object>)e.getData();
    ArrayList<ArrayList<Point>> lines = (ArrayList<ArrayList<Point>>)data.get(0);
    ArrayList<Color> colors = (ArrayList<Color>)data.get(1);
    ArrayList<Integer> thickness = (ArrayList<Integer>)data.get(2);
    clientUI.draw(lines, colors, thickness);
}

DrawCanvas

private ArrayList<ArrayList<Point>> lines = new ArrayList<ArrayList<Point>>();
private ArrayList<Color> colorList = new ArrayList<Color>();
private ArrayList<Integer> thicknessList = new ArrayList<Integer>();
private Color color = Color.BLACK;
private int thickness = 3;
private ChatClient chat;
MouseAdapter ma;

{ // Mouse Listener Block
    ma = new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            addLine();
            lines.get(lines.size() - 1).add(e.getPoint());
            //sendCanvas();
            sendStartPoint();
            repaint();
        }// end mousePressed
        public void mouseReleased(MouseEvent e) {
            lines.get(lines.size() - 1).add(e.getPoint());
            //sendCanvas();
            sendPoint();
            repaint();
        }// end mouseReleased
        public void mouseDragged(MouseEvent e) {
            lines.get(lines.size() - 1).add(e.getPoint());
            //sendCanvas();
            sendPoint();
            repaint();
        }// end mouseDragged
    };
} // End Mouse Listener Block

// Stores all the data required to build entire canvas
public void loadCanvas(ArrayList<ArrayList<Point>> newLines, ArrayList<Color> newColors, ArrayList<Integer> newThickness){
    System.out.println("RECEIVED CANVAS");
    this.lines = newLines;
    this.colorList = newColors;
    this.thicknessList = newThickness;
    repaint();
}

// Sends all of the data required to build entire canvas
public void sendCanvas(int id){
    System.out.println("SENDING CANVAS");
    ArrayList<Object> temp = new ArrayList<Object>();
    temp.add(lines);
    temp.add(colorList);
    temp.add(thicknessList);
    temp.add(id);
    try {
        chat.sendToServer(new Envelope("draw", temp));
    } catch (IOException e1) {
        System.out.println("Error sending canvas");
    }
}

// Adds new blank line to hold points, updates attributes
public void addLine(){
    lines.add(new ArrayList<Point>());
    colorList.add(color);
    thicknessList.add(thickness);
}

1 个答案:

答案 0 :(得分:0)

我设法使我的计划有效。它没有为某些数据传输的原因提供答案,但只是将其作为事实接受并以此为基础。

如下所示,我更改了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");
        }
    }

我没有让DrawCanvas使用loadCanvas()重建它,而是更新了现有的addLine()方法:

public void addLine(ArrayList<Point> line, Color c, int t){
    lines.add(line);
    colorList.add(c);
    thicknessList.add(t);
    repaint();
}

我知道这可能不是解决这个问题的最佳方法,但我的时间紧迫而且有效。