【问题标题】:Losing data from arraylist从arraylist丢失数据
【发布时间】:2012-03-05 09:08:11
【问题描述】:

我遇到了一个问题,我在 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));
    }
    }
}
}

【问题讨论】:

  • 这不重要我删除它我试图使用getter/setter
  • 这段代码中有一堆未定义的变量,例如checkmpu(..)中的midTags;你能补充一下这些是什么吗?我不是很理解你的代码。对于您没有打印相应方法的方法调用也是如此。
  • 欢迎来到 SO!为了尽快获得更好的帮助,请发帖SSCCE
  • 请学习java命名约定并遵守它们

标签: java swing class user-interface arraylist


【解决方案1】:

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

首先想到的是您在某处重新分配 oldTag。查看您的代码以查看您是否在某处设置了 oldTags。我注意到您将其作为公共变量。你有这样做的理由吗?您应该始终将变量设为私有,除非有充分的理由将它们设为公开。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我该如何解决它。我认为这可能是一个问题,但我不确定在哪里做 mC = new mpuChecker();这样两个动作侦听器都可以访问
    【解决方案3】:

    跟进 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。

    【讨论】:

    • 私有静态 MPUComp mC = new MPUComp();在 mpuchecker 类中解决了我的问题,谢谢!我不完全确定为什么。
    • @G.Bach 感谢您解释我的回答。你有我的赞成票。
    • @CharlieMorrison:之所以可行,是因为现在,MPUComp mc 仅在程序启动时实例化一次,所以现在所有 CheckMPU(..) 调用都引用同一个对象。
    • @jpm:谢谢,我可能不会发现这一点,所以也为你点赞!