【问题标题】:How can I save and open an ArrayList?如何保存和打开 ArrayList?
【发布时间】:2014-06-26 00:13:02
【问题描述】:

我正在尝试保存ArrayList 或GraphicObjects 以便稍后重新加载。问题是,我无法加载ArrayList,我总是得到一个空的ArrayList 而不是原来的ArrayList。 原来的ArrayList里面有[Line@2f06692f]这样的Object。

这是我的代码的重要部分:

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;

这行得通,我在savedList 中得到了[Line@2f06692f]。

但是,当我尝试加载它时:

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

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

这是我的PaintPanel 类,其中graphicList 是我要保存的。

public class PaintPanel extends JPanel {

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

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

这是我的接口 GraphObject:

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

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

【问题讨论】:

  • 为了清楚起见,我们是在谈论 com.facebook.model.GraphObject 对象还是您自己的自定义对象?
  • 我有自己的接口 GraphObject
  • “保存”和“加载”案例是否属于同一个switch?如果是,那么当然在“加载”情况下,savedList 将被初始化但为空

标签: java swing arraylist switch-statement graphics2d


【解决方案1】:

很难说,但在我看来,您的 savedList 位于 actionPerformed 方法的本地范围内,因此当方法结束且未实际保存时,它超出了范围。

尝试将savedList 设为一个字段,也许?以您提供的代码量很难给出最好的建议。

Read more about this in this Scope tutorial

【讨论】:

  • 谢谢,这解决了我的问题! savedList 现在是一个全局定义的字段,而不是在 actionPerformed 方法中本地定义的。
【解决方案2】:

与

savedList = p.getGraphicList(); 

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

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

【讨论】:

  • 谢谢,durron597 解决了我的问题,但这解决了我以后会遇到的问题。谢谢!我解决了这个问题:savedList = new ArrayList&lt;&gt;(p.getGraphicList())
  • 是的,我现在看到了,两个不同的问题
猜你喜欢
  • 2017-06-04
  • 2011-04-02
  • 2016-07-16
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2011-12-19
  • 2015-01-31
  • 1970-01-01
相关资源
最近更新 更多