Referencja do tablicy obiektów

0

Witam szanowne grono, przejżałem wiele stron tego forum i nie tylko, ale nie udało mi się znaleźć odpowiedzi na moje raczej niezbyt trudne, mam nadzieję, pytanie.

Mianowicie, załóżmy, że mam 3 klasy : A ,B i C.

W klasie C utworzyłem tablicę N obiektów typu A (int ,int, boolean), np.:

public class C{
...
A o_A[] = new A[N];
for(int i...){   o_A = new A(i, 0, false);
...
}

Teraz w klasie B chciałbym sobie stworzyć pętlę w której pobierałbym po kolei te obiekty o_A typu A z tablicy obiektów (stworzone w klasie C) oraz zmieniał jakieś ich pola (np. boolean).
Muszę zatem stworzyć gdzieś jakąś referencję jak mniemam (w A,B? do A?), tylko jak to miałoby to fizycznie wyglądać?

0

nie wiem dokładnie o co Ci chodzi, ale chyba o coś takiego:

w klasie B :

C c = new C();
foreach(A a: c.o_A) {
 ....
}

0

Hej, niestety twój sposób nie kompiluje się (czym jest a ?).

Mniejsza o pętlę.
Utworzyłem tablicę obiektów klasy A w klasie C, zatem w C mogę sobie czytać pola (od konstruktora klasy A rzecz jasna) np int i = o_A[2].nr_id . Chciałbym tak samo móc czytać te pola i je modyfikować, mieć pełen dostęp do utworzonej w C tablicy obiektów, tyle że w klasie B. Dokładniej, tablica obiektów A została stworzona w init() klasy C, mojego głównego pliku programu. Może teraz trochę dokładniej napisałem. ;)

0

Nie wiem czy dobrze rozumiem, ale przeciez mozesz stworzyc metode getTableA() w klasie C, ktora bedzie zwracala tablice obiektow A i w klasie B wywolac C.getTableA()
w tablicy ktora zostanie zwrocona mozesz dokonywac zmiany.

Lub inny sposob w zaleznosci kiedy i gdzie powstaje obiekt klasy B, mozesz bezposrednio przekazac tablice obiektow A do jego konstruktora lub za pomoca metody B.setTableA()

Czy o to chodzilo, czy moze zle zrozumialem?

0

Właśnie m.in. przez metody dotychczas mi się nie udało.
Próbowałem tworzyć w klasie C coś na kształt:
public A getTableA(){ return ?; }
gdzie znak zapytania stanowi niewiadomą. Kompiluje tylko dla obiekt_A[liczba] ale to byłoby zapewne zwrócenie jednej ledwie komórki.

W klasie B natomiast, jak miałbym odebrać tę metodę : C.getTableA(); , przypisać ją do nowej tabeli klasy A? Przypominam, iż muszę zmieniać wartości pól z oryginalnej tabeli obiektów utworzonej w C.

Jak to się nie skończy, dzięki Wam a odzew. ;)

0

Przede wszystkim to Ci powiem, że to co piszesz jest trochę posrane...

Czemu nazywasz zmienną o_A ... złe nazewnictwo. ale w ogóle nie da się wymyślić sensownej nazwy dla obiektów klasy o nazwie A ... powiedzmy aObjects.

W czymże masz problem z tą tablicą... nikt Ci nie broni zrobić
c.aObjects[2]ale czemu w ogóle chcesz dostęp do tablicy z innego obiektu..

Klepsydrant napisał(a)

public A getTableA(){ return ?; }
Tablica to obiekt typu A[], a nie A... więc jak chcesz zwrócić typ A[], deklarujesz taki typ metodzie... a nie A

0

Proszę bardzo, kompilowalny kod:



class A {
	
	public int i;
	
	public A(int i){
		this.i = i;
	}

	public String toString(){
		return "A: " + i ;
	}

}

class B {
	
	A [] objects = new A[] {new A(10), new A(11), new A(12) };

	public A[] getObjects(){
		return objects;
	}

}



public class Ref {
	
	
	public static void main(String [] args){
		
		B b = new B();
		
		//Odwolania, przez pętle foreach
		for(A a: b.getObjects()){
			System.out.println(a);
		}
		
		System.out.println("------------------");
		//lub do konkretnego obiektu
		System.out.println(b.getObjects()[1]);
	}

}

wesołych świąt !

0

Witam ponownie, na świąta byłem odcięty od komputerów,internetów i jdk-ów i dopiero teraz dziękuję za pomoc. ;-) Zwłaszcza przykład procodera pomógł mi dojść do tego co zamierzałem.
Niestety pojawił się kolejny problem, z wyświetlaniem komponentów. Może poradzicie coś i na to?

W obiektach klasy nazwanej tutaj jako A (dziedziczącej po JPanel) mam obrazek, a w konstruktorze tej klasy m.in. tablicę boolean. Klasa zawiera także metodę:

public void paintComponent(Graphics g) {
  	 	
     g.drawImage(img, 0, 0, null);
   
     this.repaint();	
  		  				     		    	
     setVisible(czywidac());	    	    		
}

public boolean czywidac(){
		
return Widocznosc[i];
	
}

W klasie B, podczas tworzenia nowych obiektów klasy A, ustawiłem im boolean=false, dlatego nie wyświetlają się.
W odpowiedniku klasy o nazwie Ref (u precodera) tak jak chciałem, zmieniam wartości boolean na true, jednak obrazki nie pojawiają się (mimo iż stan ten faktycznie zmienia się na true, sprawdzam w cmd oczywiście).
Czytałem trochę o metodach validate() czy revalidate() których tu nie zastosowałem, jednak niepokoi mnie następująca sprawa.
Gdy (testowo) podczas tworzenia obiektów klasy A w klasie B, ustawię im boolean na true, a następnie w klasie Ref zmieniam true na false, obiekty które na początku widać wszystkie, kolejno znikają. Czemu nie dzieje się odwrotnie?
Zauważyłem, że kiedy obiekt sprawdzi raz iż ma argument false w setVisible(), nigdy już nie wraca do metody paintComponent, dlatego przypuszczam, iż należy gdzieś dać polecenie a'la 'refresh' temu obiektowi aby sprawdził czy czasem już program nie wymaga od niego aby stał się widoczny. Jak to osiągnąć?

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