Zmiana koloru panelu w innej klasie

0

Witam, jestem początkującym [ort]programistom[/ort]. Aktualnie robię sobie mały programik w NetBeans. Korzystam z JFrame. Wrzuciłem sobie na JFrame jakiś JPanel. I właśnie tutaj mam pytanie. Jak w osobnej klasie X (zapewne musi dziedziczyć extends? po JFrame) zmieniać kolor panelu (jPanel.setBackground(Color.red);) ??

0

"programistom", "korzystam z JFrame" :) -> programistą, mam ramkę.
Klasa (tzn. z twoim panelem )powinna dziedziczyć po JPanel i ją dodajesz do JFrame. Wtedy łatwo Ci odwołać się do obiektu bez tworzenia nowej ramki.

0

Ewentualnie tak:(albo inaczej)

Klasa kl  = new Klasa();
int a,b,c ;
      a = kl.a;
      b = kl.b;
      c = kl.c;
      panel.setBackground(new Color(a,b,c));
0

Spróbuje rozpisać swoje spostrzeżenia na temat mojego problemu, bo jak to często bywa, to co napisałem rozumiem dokładnie tylko ja :D Otóż:
W ramce (JFrame) mam przycisk (button), którym chce zmieniać kolor panelu, który jest na ramce.

private void jButtonRActionPerformed(java.awt.event.ActionEvent evt) {                                         
        jPanel.setBackground(Color.red);
    }

W taki sposób wszystko działa bez zarzutów, po naciśnięciu przycisku zmienia kolor panelu.

public void kolor() {
        jPanel.setBackground(Color.red);
}

private void jButtonRActionPerformed(java.awt.event.ActionEvent evt) {                                         
        kolor();
}

W ten oto sposób również przycisk zmienia kolor panelu.

Jednak nie taki cel sobie wyznaczyłem. Chce żeby zmiana koloru odbywała się w innej klasie, albo inaczej to ujmę, żeby zmiana koloru była wywołana dopiero wtedy, gdy w innej klasie zostanie wywołana metoda za to odpowiedzialna. Czyli chodzi mi o to, że jak nacisnę przycisk, to kolor tego Panelu zmieni się dopiero w momencie, gdy zostanie to wywołane w innej klasie.

Próbowałem już wywołać metodę kolor() w innej klasie, ale w ten sposób nie następuje zamiana koloru na panelu.
Sprawdziłem to dodając System.out.println("coś"); do metody kolor, czyli:

public void kolor() {
        jPanel.setBackground(Color.red);
        System.out.println("coś");
}

I efekt jest taki, że tekst "coś" został wyświetlony, natomiast panel nie zmienił swojego koloru.

I właśnie chodzi mi o takie rozwiązanie, żeby panel zmieniał kolor dopiero gdy zostanie wywołana funkcja, która zmieni ten kolor.
Krótko: Naciskam przycisk -> w innej klasie coś jest obliczane zmieniane (np. wywołany jest sleep(2000)) -> i dopiero po tym sleepie, panel ma zmienić kolor.
Zaznaczam, że tego sleepa nie chce dawać w buttonie.
Mam nadzieję, że za bardzo tego nie zagmetwałem, tylko mój problem jest teraz widoczny ;)
W ogóle to dzięki wielkie wszystkim, którzy mi pomogą w tym problemie.

0
public void funkcja() {
	super.setBackground(Color.red); 
	//lub
	this.setBackground(Color.red);
}

Oto odpowiedź, ale niech ktoś odpowie mądrzejszy jaka jest różnica pomiędzy tymi dwoma wywołaniami.

P.S. Mam pytanie czym sie jaka jest róznica pomiędzy tymi dwoma liniami

0

A przeczytałeś chociaż w javadocu co robi metoda setBackground? Bo chyba nie bardzo.
Otóż zmienia ona kolor jakim będzie malowane podczas najbliższego wywołania paint tło obiektu na którego rzecz ta metoda zostanie wywołana. Jak z tego wynika nie zmienia ona automatycznie koloru tła okienka/komponentu (bo i nie ma czegoś takiego). Z pola zmienianego przez metodą setBackground korzysta na przykład metoda clearRect, która jest szeroko stosowana do wymazywania obszaru jpanelu nie zajętego przez inne komponenty (czyli pustego). Oznacza to, że podczas najbliższego odsłonięcia części lub całego panela, który przez to będzie musiał być odrysowany zostanie użyta metoda clearRect i wtedy użyje właśnie nowo ustawionego koloru. Dlatego w uproszczeniu nazywa się to kolorem tła.

Efekt najlepiej widać przy częściowym zasłonięciu innym okienkiem - kolor zmieni się na nowy tylko w części, która była wcześniej zakryta i zostanie odmalowana.
Dlatego jeżeli masz referencję do jakiegoś komponentu pod nazwą np. inny, to użycie inny.setBackground(...), a następnie inny.repaint() spowoduje zmianę koloru tła tego komponentu.

Natomiast co do pytania lukgol3 czy różni się czymś this.setBackground() od super.background(), to zwykle nie różni się niczym bo nie wydaje mi się, aby była ona przedefiniowywana gdzieś w drzewie dziedziczenia Swinga. A nawet jeżeli to przedefiniowanie zwykle polega na wywołaniu w niej (czyli w this.setBackground) wersji super.setBackground() po to aby zachować pierwotną funkcję tej metody. No chyba, że sam osobiście przedefiniujesz tę metodę w swojej klasie dziedziczącej po klasie Swinga i nie wywołasz wersji oryginalnej (z klasy przodka). Wtedy będą się oczywiście różnić.

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