如何保存和打开ArrayList?

时间:2014-05-08 14:21:31

标签: java swing arraylist switch-statement graphics2d

我试图保存ArrayList GraphicObjects以便稍后重新加载。问题是,我无法加载ArrayList,我总是得到一个空的ArrayList而不是原来的ArrayList。 原始[Line@2f06692f]中有ArrayList之类的对象。

以下是我的代码的重要部分:

PaintPanel p = new PaintPanel();
...a lot of code...
@Override
public void actionPerformed(ActionEvent e) {
    ArrayList<GraphObject> savedList= new ArrayList<>();
    switch (e.getActionCommand()) {
        case "Save":
            savedList = p.getGraphicList();
            break;

这有效,我在[Line@2f06692f]中获得了savedList

然而,当我尝试加载它时:

        ...some cases...
        case "Load":
            p.setGraphicList(savedList);
            break;

这不起作用,savedList此时始终为空。

这是我的PaintPanel课程,其中graphicList是我要保存的内容。

public class PaintPanel extends JPanel {

    public ArrayList<GraphObject> graphicList = new ArrayList<>();
    ...

我不知道为什么......

这是我的Interface GraphObject:

import java.awt.*;
import java.io.Serializable;

public interface GraphObject extends Serializable {
    void paint(Graphics2D g2d, boolean tmp);
    void setPaintColor(Color color);
}

2 个答案:

答案 0 :(得分:2)

很难说,但在我看来,savedListactionPerformed方法的本地范围内,因此当方法结束并且实际上没有保存时​​,它会超出范围。

尝试将savedList作为一个字段吗?很难根据您提供的代码量给出最佳建议。

Read more about this in this Scope tutorial

答案 1 :(得分:2)

savedList = p.getGraphicList(); 

您只需将引用复制到完全相同的列表即可。之后由PaintPanel进行的所有更改也会影响savedList变量。请尝试将其更改为

savedList = new ArrayList<>(p.getGraphicList());