Потеря данных от arraylist - PullRequest
1 голос
/ 14 февраля 2012

У меня проблема с потерей данных в arrayList.После того, как я вызываю метод Refresh в классе MPUComp, я перехожу в класс mpuChecker и вызываю updateTextArea.

При этом я теряю данные, которые существовали в массиве в MPUComp.Что я делаю не так.Я думаю, что это связано с тем, как я называю класс.Как правильно хранить эти данные?

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 ]

1 голос
/ 14 февраля 2012

Похоже, что каждый раз, когда срабатывает один из ваших слушателей действий, он создает новый mpuChecker, и каждый из них создает свой собственный MPUComp (который не связан с оригиналом). Именно эти несвязанные MPUComp s, на которых вызываются refresh и updateTextArea, а не MPUComp, с которых все началось. Таким образом, эти новые MPUComp не будут иметь доступа ни к каким данным в оригинале (включая содержимое ArrayList.

).
1 голос
/ 14 февраля 2012

Следуя рекомендациям jpm, чтобы избежать этого, вы можете сделать

private MPUChecker mC = new MPUChecker();

в MPUComp.Таким образом, вы создаете экземпляр mpuchecker только один раз.Затем оба ActionListeners могли бы использовать этот 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, который он должен проверять.

0 голосов
/ 14 февраля 2012

Я не вижу в вашем коде ничего очевидного, что могло бы вызвать его, поэтому я просто собираюсь предложить несколько общих советов.

Первое, что приходит на ум, - это то, что вы переназначаетеoldTags.Просмотрите свой код, чтобы увидеть, устанавливаете ли вы где-нибудь старые теги.Я заметил, что у вас есть в качестве публичной переменной.У тебя есть причина для этого?Вы должны всегда делать переменные закрытыми, если только у них нет веских причин быть открытыми.

После этого начинайте искать вызовы методов, которые удаляют элементы из ArrayLists (clear, remove, set).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...