JLabel pytanie

tomas1704
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
0

Czysto teoretycznie mam 4 rożnych klas które wykorzystują swinga.
KLASA A
to w zasadzie takie menu, 5 przycisków jakieś ogólne informacje i 1 JLabel.
KLASA B,C,D
To klasy które również mają swojego JFame 2 przyciski które odpowiadają za wywołanie "jakiejś tam" funkcji która wykonuje "jakąś tam" operacje.
Ja chcę aby w klasie A:
po wywołaniu funkcji z klasy B,C,D i uwaga B1,B2,B3 lub C1,C2,C3 lub D1,D2,D3 (każde kliknięcie przycisku w klasie A wywołuje nowy obiekt klasy B lub C lub D) mój Jlabel 1 zmienił wartość z "0" na "1" kolejne wywołanie funkcji (nie ważne w którym obiekcie jednej z klas BCD) owocowało zwiększeniem wartości z "1" do "2" i analogicznie każde kolejne wywołanie funkcji w jednym z obiektów dawało wartości "3", "4", "5". Wiem że trochę to zawiłe ale mam nadzieję że zrozumiecie to co napisałem i pomożecie rozwiązać ten problem z góry dzięki i pozdrawiam!

Chodzi mi o stworzenie czegoś na wzór zmiennej globalnej - nie ważne w którym obiekcie danej klasy wywołam funkcje to w niej zostanie dodana do zmiennej globalnej wartość zmiennaGlobalna++;
Macie jakieś pomysły?

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 2 godziny
0

public static, aczkolwiek wg mnie static to zło i powinieneś stworzyć osobną klasę do trzymania zmiennej, stworzyć jej instancję i przekazać tą instancję do wszystkich obiektów.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
tomas1704
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
0

No właśnie o to mi chodzi jak zrobić klasę a później jej instancje(obiekt) który będzie zliczał wywołane funkcje we wszystkich innych obiektach, może chociaż kawałeczek kodu z podpowiedzią? ;]

Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:ponad 10 lat
0

Hmmm jeżeli potrzebujesz koniecznie zmiennych "globalnych" to można to zrobić w ten sposób

Kopiuj
 
public class KlasaZmiennychGlobalnych
{
    public static zmienna1
    public static zmienna2 
// itd itp 
}
 

a później w kodzie możesz się do nich bezpośrednio odwoływać np

Kopiuj


KlasaZmiennychGlobalnych.zmienna1=1;
KlasaZmiennychGlobalnych.zmienna2=KlasaZmiennychGlobalnych.zmienna1++;
 

itd itp

zauważ, że cały czas należy z takim czymś pracować jak z klasą(wywołania). zmienna1 zmienna2 nie są zmiennymi globalnymi(bo takowych nie ma w javie), ale można do nich się odwoływać z każdego miejsca. Jako że są to pola klasy, mogą one być również obiektami, a więc innymi klasami, komponentami itd itp.

Nie bardzo rozumiem jaki masz cel, ale można jeszcze skorzystać z tego, że wszystkie obiekty danej klasy, która posiada pole statyczne, będą odwoływał się do jednego, i tego samego pola (a więc "fizycznie" odwołują się do tej samej komórki pamięci)

Kopiuj
 
public class MojaKlasa
{
     private static int ileInstancji=0;

     public MojaKlasa()
           {
                 ileInstancji++;
           }
     public void odp()
      {
            System.out.print("Ilosc utworzonych instancji klasy MojaKlasa to: "+Integer.ToString(ileInstancji));
      }

}


// wywołania

MojaKlasa A,B,C,D,E;
A=new MojaKlasa();
B=new MojaKlasa();
C=new MojaKlasa();
D=new MojaKlasa();
E=new MojaKlasa();

C.odp();

Na konsoli pojawi się Ilosc utworzonych instancji klasy MojaKlasa to: 5
Mam nadzieję, że to pomogło ;)


www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!
edytowany 3x, ostatnio: Antoniossss
tomas1704
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
0

Nie chodzi mi tutaj o ilość instancji danej klasy chodzi mi o to ile te (wszystkie) instancje lacznie wywołały funkcji np.
ObiektA klasyA wywołał funkcje 6 razy pseudoGlob = 6
ObiektB klasyB wywołał inną funkcje (robiąca co innego) 10 razy wiec pseudoGlob = 6 +10
ObiektA1 KlasyA wywołał 3 razy funkcję (która coś robi) zatem pseudoGlob = 16+3
ObiektC klasyC wywołał 0 razy funkcje która coś tam robi zatem pseudoGlob = 16 +0
itd.
a sumę tych wywołań chcę przedstawić w JLabel w obiekcieGlownejKlasy który np będzie się odświeżał co jakiś czas

Ale już mnie trochę naprowadziły wasze posty, będę kombinował dalej.

Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:ponad 10 lat
0

hah ;D
a co za problem przy wywoływaniu funkcji dodać inkrementacje statycznej zmiennej (tak jak u mnie przy tworzeniu instancji)? przecież SPOZA klasy możesz się dostać do pól statycznych.
Dalej

Jak już tą liczbę masz w JLabel to zrób po prostu takie coś

Kopiuj
 
public class Zmienne{
     public static labelek JLabel=new JLabel.setText("0"); // to label moze byc statyczny
     public static int liczba=0;

    public static inc()
    {
         labelek.setText(Integer.toString(Integer.parseInt(labelek.getText())+1));
         liczba++;
    }
}

//a w swoim kodzie, przed czy po wywyłaniu funkcji które chcesz 

Zmienne.inc();
mojaKlasa.LiczWywolanie();

no jak to nie to (btw w poprzednim poscie ten sam motyw przedstawilem) to ja nie wiem o co chodzi ;) zresztą jeżeli zrozumiałeś w jaki sposób instancje się zliczają w moim poprzednim przykładzie, to dziwie się, że nie możesz tego przenieść na swój problem ;) pisz jak Ci idzie ;)

aaa no chyba, że ty masz problem wyświetlenia tego w głownej klasie .

rozwiązanie:

  1. zrezygnuj z JLabel w głównej klasie i korzystaj tylko z tego statycznego (dla kodu to bedzie zmiana z nazwaLabela na Zmienne.labelek.
  2. podsaw pod statycznego labelka, referencje na tego co już utorzyłeś (chociaż tego nie jestem pewny czy bedzie dziłać:)) tzn Zmienna.labele=nazwaLabelaZGlownejKlasy.

www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!
edytowany 1x, ostatnio: Antoniossss
tomas1704
Trochę nie bardzo wiem jak się odnieść do tych rozwiązań. Mała podpowiedz? ;]
tomas1704
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
0

Zmienne statyczne działają właśnie tak jak tego chciałem! Jeszcze nie wiem dlaczego to zło ale pewnie niedługo się dowiem. Mam jeszcze jedno pytanie w związku z tym jak odświeżyć mojego JLabel w menu głównym gdzie nie dzieje się nic dynamicznego po za wywoływaniem innych klas które miedzy innymi dodają do pseduGlob wartość ++?
Chodzi mi o to jak np odświeżyć dany komponent powiedzmy co 10 sekund albo całe okno/panel jeśli trzeba

Na razie mam tyle klasaA = główna i tam jest label 0 KlasaB wywolana przez przycisk w klasieA i tam jest funkja przycisk z klasyB wywołuje funkcje a ta dodaje do zmiennej statycznej w klasieC wartość +1. W głównym oknie do label dodałem setText(pseudoGlob_z_klasyC) którą wcześniej zamieniłem na stringa. a jak to odmalować po tym jak pseudoGlob zmieni wartość?

edytowany 2x, ostatnio: tomas1704
Antoniossss
zrób label jako statyczny i setText(pseudoGlob_z_klasyC) rób zaraz po inkrementacji. Innej opcji nie ma (nie no fakt jest np. dodać propertyChangeListenera.... wstawić równoległy wątek.... ale po co ;) zmień swojego labela na statycznego i za każdą inkrementacją zmieniaj jego tekst;) (na upartego w klasie A przy dekladacji - public JLabel - dopisz static -> public static JLabel ;)
Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:ponad 10 lat
0

zastosuj to moje drugie rozwiązanie z poprzedniego posta. Jeżeli nie będzie działało( sam za długo w Javie nie pisze i nie wiem jak tu jest z referencjami. Zdaje się, że chyba niestety przekazanie jest wyłącznie przez wartość przez co nie zadziała - ale pewny nie jestem - w cepie by to działało ;P) noooo to statycznie trzymasz inta który trzyma ile tych tam wywołań było i....

  1. nie wiem czemu ma to się wywoływać niby co 10 sekund (bezsens) ale możesz wprowadzić nowy wątek do tego ;P
  2. po prostu zaraz po inkrementacji, wywołaj sobie setText(teks + staticVAR) dla swojego labela. Efekt będzie Od razu widoczny;)
  3. jeżeli problem jest z dostępem z innych klas do labela, wykorzystaj rozwiązanie nr 1 z poprzedniego posta, a więc statyczny label (oraz najlepiej statyczny int)
    wówczas zewsząt będziesz miał do niego dostęp.

w razie jakbyś pytał - po setText będzie Od razu widać efekt.

BTW. Też nie wiem czemu statyczne są złem, ale za krótko pisze w Javie (a może i ogólnie), żeby się przekonać ;)


www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!
tomas1704
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
0

Już sprawdzam!
Jest mały problem ten label nie mogę go wywalić ani uczynić statycznym ponieważ szablon był robiony w netBeans a tam jest wykorzystywany jakiś dziwny rozpasły layout którego jeszcze nie ogarniam i nawet jeśli zamieniam tego labela na static to nie mogę się do niego odwołać w tej klasieC gdzie mam te statyczne zmienne.
Moja pomyłka mogę się odwołać nie zmieniłem z private na public jednak nadal mi nie odświeża nie wiem dlaczego.

edytowany 2x, ostatnio: tomas1704
Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:ponad 10 lat
0

daj kawałeczek kodu przed i po wywołaniu tej Twojej metody do zliczania( z klasy B oczywiście).
aaah a jeszcze jedno - przy przypadkiem jeśli zmienić myszką (podczas działania już) rozmiar okna, to ten label się nie zmieni ?? ;)


www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!
edytowany 3x, ostatnio: Antoniossss
tomas1704
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
0

Już mi działa ;]
Dziękuję ci bardzo za pomoc świetne rady! Okazało się ze po pierwsze miałem label private a powinno być public i odwoływałem się w złym miejscu do tego statycznego labela ;]
Pozdrawiam!

Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:ponad 10 lat
0

No to fajnie że działa.
Powodzenia!


www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.