从arraylist丢失数据

时间:2012-02-13 23:10:36

标签: java swing class user-interface arraylist

我遇到的问题是我在arrayList中丢失了数据。在MPUComp类中调用方法Refresh之后,我进入类mpuChecker并调用updateTextArea。

通过这样做,我丢失了MPUComp中arraylist中存在的数据。我做错了什么。我认为这与我如何称呼课程有关。如何正确保存这些数据?

public class MPUComp extends JFrame {
{

private mpuChecker mC;
public ArrayList<String> oldTags = new ArrayList<String>();

public void menu()
{
//...
class MenuActionListener3 implements ActionListener {   
    public void actionPerformed(ActionEvent e)
    {
        mC = new mpuChecker();
        mC.CheckMpu(path, textField.getText(),1);
        setVisible(false);
    }
}
class MenuActionListener4 implements ActionListener {   
    public void actionPerformed(ActionEvent e)
    {
        mC = new mpuChecker();
        mC.CheckMpu(path2, textField_1.getText(),2);
        setVisible(false);
    }
}   

public void refresh(String pane1) {
    textArea_1.append(pane1 + "\n");
    System.out.println(getOldTags().size());
    System.out.println(oldTags.size());
    //both print out zero when called second
}


public void updateTextArea(final String text) {
       textArea_2.append(text + "\n");
       oldTags.add(text);
       System.out.println(oldTags.size());
       //prints out the correct arraylist size
}
}
}

//second class which calls updateTextArea and refresh

public class mpuChecker {

   private MPUComp mC = new MPUComp();

public void CheckMpu(String path, String searchToken, int form)
{
 // Print the text to the appropriate text-area either 1 or 2
public void ary1(int path)
{   
    if(path == 1)
    {
        for(int l = 0; l <  midTags.size(); l++)
    {
        mC.refresh(midTags.get(l));
    }
    }
    if(path == 2)
    {
        for(int lk = 0; lk <  midTags2.size(); lk++)
    {
        mC.updateTextArea(midTags2.get(lk));
    }
    }
}
}

3 个答案:

答案 0 :(得分:1)

看起来每次触发一个动作侦听器时,它都会创建一个新的mpuChecker,其中每一个都会创建它自己的MPUComp(与原始动作无关)。正是这些不相关的MPUComp被调用refreshupdateTextArea,而不是MPUComp这一切都来自。因此,这些新的MPUComp将无法访问原始数据中的任何数据(包括ArrayList的内容。

答案 1 :(得分:1)

跟进jpm的建议,为了避免这种情况,你可以做到

private MPUChecker mC = new MPUChecker();

在MPUComp中。这样你只需要实例化一次mpuchecker。然后,两个ActionListener都可以使用该MPUChecker。

如果您希望每个ActionListener都拥有自己的MPUChecker,您可以将其侦听器的创建移动到这些内部类的主体中,如此

class MenuActionListener3 implements ActionListener {   
    MPUChecker menu3mC = new mpuChecker();

    public void actionPerformed(ActionEvent e)
    {
        menu3mC.CheckMpu(path, textField.getText(),1);
        setVisible(false);
    }
}

另一方面,MPUChecker本身可能指的是错误的MPUComp,因为你在初始化该对象时为MPUChecker创建了一个。除非这是预期的行为,否则您可以删除

private MPUComp mC = new MPUComp();
来自MPUChecker的

,使CheckMPU静态并给它一个额外的参数:它应该检查的MPUComp。

答案 2 :(得分:0)

我在代码中看不到任何明显可能导致它的东西,所以我只是建议一些一般提示。

首先想到的是,你正在重新分配旧标签。查看您的代码,看看您是否在某处设置oldTags。我注意到你把它作为一个公共变量。你有理由吗?除非有充分的理由让它们公开,否则你应该始终将变量设为私有。

之后开始寻找从ArrayLists中删除元素的方法调用(清除,删除,设置)。