Невозможно добавить / клонировать массив из метода update (Observer) - PullRequest
1 голос
/ 23 января 2020

Я делаю небольшую программу, используя Observer / Observable, в которую вы можете ввести свой идентификатор, имя, фамилию и оценку, а затем сохранить ее. Затем вы можете выполнить поиск, если этот идентификатор найден.

Я делаю ArrayList из трех классов: Observer и Observable и EnteringValues.

У меня есть класс Observable. SujetConcret и класс Observer Search

И есть класс EnteringValues, который я добавил слушателем для кнопки сохранения:

EnteringValues. java

public class saveListener implements ActionListener {
public void actionPerformed (ActionEvent event){
    try {
        FileWriter fileWriter = new FileWriter(file, true);
        tid.write(fileWriter);
        fileWriter.write("\n");
        fileWriter.close();
        ar.add(tid.getText());
        s.setValue(ar);

    } catch (IOException ex) {
        System.out.println(ex.getMessage());
        }
    }   
}

Здесь, как вы можете видеть, я добавил идентификатор из JTextfield в ArrayList (String) ar и с помощью s.setValue(ar) добавил его в класс Observable SujetConcret

SujetConcret. java (наблюдаемый)

public class SujetConcret extends Observable {
    ArrayList<String> ar = new ArrayList<String>();

void setValue(ArrayList<String> arx){
    ar=arx;
    setChanged();
    notifyObservers();
}

ArrayList getValue(){
    return ar;
   }
}

Поиск. java (наблюдатель)

public void update(Observable ob, Object o1) {
        ax = (ArrayList<String>) ((SujetConcret)ob).getValue().clone();
}

Вызов ax для определения, взяла ли ax значения из Наблюдаемого массива в Search классе

ArrayList<String> ax = new ArrayList<String>(); //Under public class Search extends..
Search(SujetConcret s){
    this.s=s;
        for(int i=0; i<s.getValue().size();i++){
        System.out.println(ax.get(i));
    }
}

Проблема:

Здесь я сталкиваюсь с классом Search, я пытаюсь обновить (после получения уведомления) ArrayList (String) ax, созданный в классе Search , Я тестировал, чтобы увидеть, добавляются ли значения из EnteringValues ArrayList ar в Observable Arraylist с использованием for l oop и печать всех значений в классе Search с использованием s.getValue().get(i), и это работает.

Но в методе обновления для Observer я пытался его клонировать и добавить, но у меня возникают исключения при запуске программы.

Я пытался в методе update не включать Observable поэтому я заменил этот метод на ax.add("1"), и он дал мне IndexOutOfBoundsException, теперь я понял, что ошибка в ArrayList ax, а не в Observable ArrayList.

...