Dodawanie/usuwanie obiektów do kolekcji

0

Cześć, piszę program którego zadanie to wyświetlenie obiektów (String imie, nazwisko) w różnych kolekcjach.
Niestety napotkałem pewien problem...

@Override
	public void actionPerformed(ActionEvent e) {		
		String im, nz;
                Osoba o1;
                Object source = e.getSource();
                
                if(source == dodajBtn){
                    im = imieTField.getText();
                    nz = nazwTField.getText();                    
                    o1 = new Osoba(im, nz); 
                    vector.add(o1);
                    
                }
                
                else if(source == usunBtn){
                    im = imieTField.getText();
                    nz = nazwTField.getText();                    
                    o1 = new Osoba(im, nz);  
                    vector.remove(o1);                 
                    vector.trimToSize();
                    
                }
                
                else if (source == wyczyscBtn){
                    vector.clear();                    
                }
                
                if((source == wyswietlBtn) || (checkBox.isSelected())) {
                    Iterator it;
                    vectorView.clear();
                    
                    it = vector.iterator();
                    while(it.hasNext()){
                        o1 = (Osoba)it.next();
                        vectorView.addItem(o1.toString());
                    }
                }

Jeżeli dobrze wszystko rozumiem, po kliknięciu przycisku wyświetlania (bądź przy zaznaczonym checkbox'ie) program powinien wyczyścić widok vectora, przeskanować obiekty Osoba i wyświetlić je w postaci String w tym widoku.
Przyciski dodawania i czyszczenia działają, mogę cały vector wyczyścić, mogę dodać różne obiekty.
Jednak gdy chcę usunąć konkretny obiekt, nie dzieje się nic. Dlaczego?

0

W tym miejscu o ile się nie mylę tworzysz nowy obiekt o1 a potem chcesz go usunąć...

 else if(source == usunBtn){
                 im = imieTField.getText();
                 nz = nazwTField.getText();                    
                 o1 = new Osoba(im, nz);  
                 vector.remove(o1);                 
                 vector.trimToSize();
}

tyle że vector.remove(Object o) porównuje obiekty przy pomocy referencji tzn. nie może znaleźć adresu tego obiektu w Vector więc go nie usuwa.
Nie może go znaleźć bo

Osoba o1 = new Osoba();

tworzy nowy obiekt(z nowym adresem w pamięci).
by to działało tak jak ty chcesz to musisz wyszukać w Vectorze odpowiedni obiekt Osoba na podstawie inputów jakie pobierasz do zmiennych im, nz. a potem go usunąć.

0
 else if(source == usunBtn){
                    Iterator it = vector.iterator(); 
                    im = imieTField.getText();
                    nz = nazwTField.getText();
                    while(it.hasNext())
                    {
                        o1 = (Osoba)it.next();
                        if((o1.getImie().equals(im)) && o1.getNazwisko().equals(nz))
                                {
                                    vector.remove(o1);
                                    vector.trimToSize();
                                }
                    }

Coś takiego wykombinowałem, teoretycznie to działa... ale gdy w vectorze jest tylko 1 obiekt np.
Jan Kowalski
muszę kliknąć usuń 2 razy
bądź usuń i wyświetl (ręcznie, mimo wciśniętego checkbox'a który powinien automatycznie odświeżyć vector)

0

Po pierwsze to usuwaj używając iteratora skoro go masz np.:

    Iterator<Person> it = vector.iterator();
    while(it.hasNext()) {
        Person current = it.next();
        if (current.getName() == "TEST") {   //ewentualnie .equals("TEST")
           it.remove();
        }
    }

No tak bo masz 2 Vectory jeden do widoku a drugi do obróbki co jest trochę dziwne... powinieneś swój wektor po każdej edycji przekazać do widoku. Albo...

ustaw sobie zmienną która będzie mówić czy zrobić refresh na widoku czy nie... i na podstawie tego sobie odświeżaj dane(Tak jak masz to w tym ostatnim if'ie ;)).

0

@Emdzej93, jest ogromna różnica pomiędzy ==, które porównuje referencje (czy to ten sam obiekt w pamięci), a metodą equlas, która porównuje czy dwa obiekty są sobie równe. W Javie przy porównywaniu obiektów używamy metody equals.

0
public class KolekcjeView extends JScrollPane{
	
	private JList lista;
	private DefaultListModel modelListy;
	
	KolekcjeView(int szer, int wys, String opis){
		super();
		modelListy = new DefaultListModel();
		lista = new JList(modelListy);
		setViewportView(lista);
		setPreferredSize(new Dimension(szer, wys));
		setBorder(BorderFactory.createTitledBorder(opis));
	}
	
	void clear(){
		modelListy.clear();
	}
	
	void addItem(Object o){
		modelListy.addElement(o);
	}      
}

to klasa odpowiedzialna za widok kolekcji jakby co, w planach mam zamiar dodać poza vectorem takżę arraylist, linkedlist, itd (zadanie polega na obsłudze obiektów klasy Osoba w różnych kolekcjach)

@Koziołek
Tak wiem, ale w swoim kodzie chyba nigdzie nie porównuje obiektów za pomocą '=='?

@scale
"2 vectory" to sugestia prowadzącego zajęcia, da się to jakoś obejść i pracować na samej kolekcji vector w której zapisuje obiekty oraz JList w którym wyświetlam te obiekty?

co do obróbki o ktorej wspomniałeś

if((source == wyswietlBtn) || (checkBox.isSelected())) {
                    Iterator iterator;
                    vectorView.clear();
                    
                    iterator = vector.iterator();
                    while(iterator.hasNext()){
                        o1 = (Osoba)iterator.next();
                        vectorView.addItem(o1.toString());
                    }
                }

checkbox jest zaznaczony więc czy program nie powinien po każdej operacji czyścić widok i następnie skanować iteratorem kolekcję vector i wyświetlać jej aktualną wersję?

1 użytkowników online, w tym zalogowanych: 0, gości: 1