Dodawanie elementów do ArrayList - dodaje się n razy ostatni...

0

Witam, mam problem ze swoim projektem. Próbuję wczytać 16 elementów do ArrayList. 16 elementów się wczytuje, ale jak próbuję je wypisać to 16 razy wypisuje się ostatni element... Nie za bardzo rozumiem gdzie jest błąd i już nie mam pomysłów jak go poprawić...

Deklaracja ArrayList w klasie Game:

public static ArrayList<Building> buildingList = new ArrayList<>();

Metody w klasie Map do wczytywania mapy (terenu do tablicy) oraz budynków (na listę):

    private void readBuilding(Terrain objct, int x, int y) {
	System.out.format("Dodaję: ");
	//Czerwone centrum dowodzenia
	if(objct.getSSX() == 1 && objct.getSSY() == 3) {
	    Building b = new Building(x, y, 1, 1);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Czerwona miasto
	if(objct.getSSX() == 2 && objct.getSSY() == 3) {
	    Building b = new Building(x, y, 2, 1);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Czerwona fabryka
	if(objct.getSSX() == 3 && objct.getSSY() == 3) {
	    Building b = new Building(x, y, 3, 1);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Niebieskie centrum dowodzenia
	if(objct.getSSX() == 1 && objct.getSSY() == 4) {
	    Building b = new Building(x, y, 1, 2);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Niebieska fabryka
	if(objct.getSSX() == 2 && objct.getSSY() == 4) {
	    Building b = new Building(x, y, 2, 2);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Niebieskie miasto
	if(objct.getSSX() == 3 && objct.getSSY() == 4) {
	    Building b = new Building(x, y, 3, 2);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Niczyje miasto
	if(objct.getSSX() == 4 && objct.getSSY() == 3) {
	    Building b = new Building(x, y, 3, 0);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Niczyja fabryka
	if(objct.getSSX() == 4 && objct.getSSY() == 4) {
	    Building b = new Building(x, y, 2, 0);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
    }
    
    private void createMap() {
	map = new Terrain[40][22];
	String[] fields = csvFileContent.split(";");
	int x, y;
	int fieldNo = 0;
	
	for(y = 0; y < 22; y++) {
	    for(x = 0; x < 40; x++) {	    
		Terrain objct = new Terrain();
		objct.setSSX(Integer.parseInt(fields[fieldNo].substring(0,2)));
		objct.setSSY(Integer.parseInt(fields[fieldNo].substring(2,4)));
		if(objct.getSSY() > 2) {
		    readBuilding(objct, x, y);
		    objct.setSSX(3);
		    objct.setSSY(1);
		}
		fieldNo++;
		map[x][y] = objct;
	    }
	}
	System.out.format("Elementow: %d\n",Game.buildingList.size());
	for(Building b : Game.buildingList) {
	    b.writeBuilding();
	}
    }

Metoda klasy Map, renderująca mapę (czyli osobno teren (tablicę) i osobno budynki (z listy))

public void render(Graphics graphics, Game game) {
        int x, y;
	//System.out.println("Budynkow: " + game.getBuildingList().size());
        for(y = 0; y < 22; y++) {
            for(x = 0; x < 40; x++) {
                field = ss.grabImage(map[x][y].getSSX(), map[x][y].getSSY(), 32, 32);
                graphics.drawImage(field, x*32, y*32, null);
            }
        }
	Iterator<Building> it = Game.buildingList.iterator();
	while(it.hasNext()) { 
	    Building b = it.next();
	    field = ss.grabImage(b.getSSX(), b.getSSY(), 32, 32);
	    graphics.drawImage(field, b.getX()*32, b.getY()*32, null);
	}
    }

Cała tablica "terenu" poprawnie się wypisuje na ekran.
Problem w tym, że na ekranie rysuje mi się tylko i wyłącznie ostatni znaleziony element (budynek)...
Budynek się renderuje poprawnie i w odpowiednim miejscu, ale co z resztą?
Dodam, że próbowałem również w ten sposób przechodzić po liście:

for(Building b : Game.buildingList) {
	field = ss.grabImage(b.getSSX(), b.getSSY(), 32, 32);
	graphics.drawImage(field, b.getX()*32, b.getY()*32, null);
}

Również to nic nie dało.
Wskazówka - w metodzie readBuilding() mam takie linijki:

b.writeBuilding();

przed dodaniem każdego elementu. Czyli wypisuję wartości wszystkich pól danej instancji na konsolę w NetBeans-ie. I wartości pól w obiektach się zgadzają. A i tak dodaje się coś innego, ponieważ jak próbuję wypisać całą listę to wypisuje mi jako kolejne elementy, ten sam budynek.

Bardzo proszę o pomoc. Za wszelkie pomysły i sugestie z góry serdecznie dziękuję!
Pozdrawiam!

0
  1. zapnij się debuggerem na początku metody render
  2. jak program się tam zatrzyma to sprawdź zawartość tablic/ kolekcji, które cię interesują
  3. napisz co zauważyłeś
0

Dobra, wiem już co było źle. W klasie Building miałem statyczne pola, które przy tworzeniu nowych instancji tej klasy się nadpisywały. Więc jak tworzyłem nowy element i dodawałem go do listy to poprzednie na liście zmieniały wartości na takie, które ustawiłem w nowym.
Mimo wszystko dziękuję za próbę pomocy. ;)

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