komunikat "non-static variable this cannot be referenced ...."
trzcinka - 22-03-2006 13:14
komunikat "non-static variable this cannot be referenced ...."
Witam Proszę o pomoc w rozwiązaniu problemu który czesto mi się pojawia. Robie sobie klase np
class oknoText extends JTextArea { public void oknoText(String t, int x, int y, int sz, int wy) { JLabel b1 = new JLabel (t); } }
i teraz w funfcji main próbuję utworzyć obiekt tej klasy
JTextArea komunikat = new oknoText("sdfgsdfsfsf");
i umieścić na warstwie
c.getLayeredPane().add(komunikat);
jednak podczas kompilacji dostaję komunikat: "non-static variable this cannot be referenced from a static context"
Czy ktoś mógł by w prosty sposób wyjaśnić mi i może innym o co chodzi. Wiem że dla wielu jest to banał ale ja nie wiem o co chodzi i jeśli kogoś to irytuje proszę o powściągliwość. Dzięki za pomoc życzliwym.
wrobel cwirek - 22-03-2006 13:14
trzcinka <uu@uu.pl> napisał(a): > > Czy ktoś mógł by w prosty sposób wyjaśnić mi i może innym o co chodzi. Wiem > że dla wielu jest to banał ale ja nie wiem o co chodzi i jeśli kogoś to > irytuje proszę o powściągliwość. Dzięki za pomoc życzliwym. > W metodach statycznych mozesz sie odwolywac jedynie do pol i metod starycznych.
Jesli masz obiekty nie-startyczne - musisz sie do nich odwolywac z kody nie-statycznego.
Nie dziala to w druga strone, tzn. z obiektow nie-statyczncyh mozesz odwolywac sie do obiektow statycznych (metod, pol)
-- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
trzcinka - 22-03-2006 13:14
Czy na podstawie tego przykładu możesz zademonstrować jak to powinno wygladać i jak rozpoznać która metoda jest statyczna a która nie?
Pozdrawiam
Leonard Milcin Jr. - 22-03-2006 13:14
trzcinka skrev: > Witam > Proszę o pomoc w rozwiązaniu problemu który czesto mi się pojawia. Robie > sobie klase np > > class oknoText extends JTextArea > { > public void oknoText(String t, int x, int y, int sz, int wy) > { > JLabel b1 = new JLabel (t); > } > }
Z innej beczki: nazwy klas zwykło się rozpoczynać wielką literą w przeciwieństwie do nazw zmiennych które rozpoczyna się małą literą, lub pisze wyłącznie wielkimi literami.
Pozdrawiam,
Leonard
=?UTF-8?B?QXJ0dXIgQ2h5xbx5?= - 22-03-2006 13:14
trzcinka wrote: > Czy na podstawie tego przykÂładu moÂżesz zademonstrowaĂŚ jak to powinno > wygladaĂŚ i jak rozpoznaĂŚ która metoda jest statyczna a która nie? > > Pozdrawiam > > Witam. Metoda statyczna to np. static void wyswietl(){} albo najczesniej spotykana public static void main(String[] args){} czyli ta ktorej uzyles :)
Szczerze nie wiem jak na tym przykladzie bo u mnie dziala bez problemu public static void main(String[] args) { OknoText komunikat = new OknoText(); komunikat.oknoText("aaa",100,100,100,100); JFrame frame = new JFrame(); frame.getLayeredPane().add(komunikat); frame.setVisible(true); } Dziwi mnie za uzyles JTextArea komunikat = new oknoText("sdfgsdfsfsf"); Po pierwsze powinien ci wyrzucic ze nie ma takiego konstruktora (klasa oknoText nie ma takiego konstruktoa chociaz klasa JTextArea ma). Druga sprawa ze w ten sposob tworzysz obiekt JTextArea wiec jakos to nie ma sensu. Jakbys mial konstruktor i w nim wywolal super() to cos moze by z tego bylo.
Bardzo chetnie ci pomoge ale wkleiles czesciowy kod. Reszty musialem sie domyslic. Ostatecznie nie wiem czy chcesz sie dowiedziec co oznacza static czy rozwiazac twoj przyklad.
Wyjasnienie przedmowcy o static jest trafne i powinno rozjasnic sprawe.
Pozdrawiam Artur Chyży
P.S. Prosze nazywaj nazwy klas zgodnie z konwencja czyli od duzej litery. Metody zaczynaja sie od malych :)
trzcinka - 22-03-2006 13:14
przepraszam całego teksu nie umieściałem zeby nie "zaśmiecać" obrazu sprawy ale jeśli takie życzenie to dołączam całą klasę
public void oknoText(String t,int x,int y,int sz,int wy ) { JLabel b1 = new JLabel (t); b1.setFont(new Font("Dialog", Font.BOLD| Font.ITALIC,16)); b1.setForeground(Color.yellow); b1.setOpaque(false); b1.setBounds(x,y,sz,wy); Border rbx1=BorderFactory.createRaisedBevelBorder(), rby1=BorderFactory.createLoweredBevelBorder(); b1.setBorder(BorderFactory.createCompoundBorder(rb x1, rby1)); }
main { .. .. JFrame c = new okno(); .. .. JTextArea d = new oknoText("To jest teks", 100,100,300,300); c.getLayeredPane().add(d);
a odnośnie " Ostatecznie nie wiem czy chcesz sie dowiedziec co oznacza static czy rozwiazac twoj przyklad." - chcę się dowiedzieć jaka klasa to statyczna bo jeśli ma atrybut static to zrozumiałe ale w moim przypadku nie widzę czegoś takiego a komunikat jest więc pytanie moje zostaje dalej aktualne
pozdrawiam
Piotr Kobzda - 22-03-2006 13:14
trzcinka wrote:
[...] > a odnośnie " Ostatecznie nie wiem czy chcesz sie dowiedziec co oznacza > static czy > rozwiazac twoj przyklad." - chcę się dowiedzieć jaka klasa to statyczna bo > jeśli ma atrybut static to zrozumiałe ale w moim przypadku nie widzę czegoś > takiego a komunikat jest więc pytanie moje zostaje dalej aktualne >
No to uważaj... :)
Kontekst statyczny (static context), to: -- metoda statyczna, -- inicjalizator statyczny klasy, -- inicjalizator pola statycznego.
O tym czy metoda/blok inicjujący/pole jest statyczny(e) decyduje modyfikator 'static' tego elementu, nie zaś klasy, w której się znajduje.
Klasa statyczna (z modyfikatorem static lub zadeklarowana w kontekście statycznym) kontekstu statycznego nie określa -- statyczność klasy decyduje jedynie o braku powiązania obiektów tej klasy z obiektami klasy zawierającej (nawiasem mówiąc, klasa top-level także za statyczną w tym rozumieniu uznawana być musi, pomimo, że modyfikator static nie jest dla niej dozwolony...).
W kontekście statycznym nie możesz odwoływać się do obiektu (instancji klasy), gdyż z żadnym obiektem nie jest [ów kontekst] powiązany. Dopiero niestatyczny kontekst udostępnia referencję do obiektu przez 'this', którą zwykle w odwołaniu się pomija.
W Twoim przypadku 'c' jest polem obiektu, więc zapis:
c.getLayeredPane().add(komunikat);
interpretowany jest jako:
this.c.getLayeredPane().add(komunikat);
W kontekście statycznym jednak 'this' nie istnieje, więc kompilator grzecznie Cię o tym fakcie informuje.
Gdyby pole 'c' było statyczne (pomijam sensowność takiego rozwiązania), to kompilator potraktowałby Twój zapis jako:
OknoText.c.getLayeredPane().add(komunikat);
i nie miałby nic przeciwko.
Rozwiązanie, to przenieść cały kod inicjalizacyjny z metody main do wydzielonej metody obiektu, lub jeśli koniecznie chcesz odwoływać się do pól w kontekście statycznym, jawnie wskazać obiekt, który Cię interesuje np. tak:
OknoText oknoText = new OknoText(); oknoText.c.getLayeredPane().add(komunikat);
BTW -- Dobrą praktyką jest jawne poprzedzanie odwołań do pól obiektów słówkiem 'this', zwiększa się wówczas nieco czytelność kodu, a przy okazji jawnie określasz oczekiwany kontekst użycia.
HTH, piotr
trzcinka - 22-03-2006 13:14
Użytkownik "Leonard Milcin Jr." <leonard.milcin@post.wytnij.pl> napisał w wiadomości news:4421206b$1@news.home.net.pl... > trzcinka skrev: >> Witam >> Proszę o pomoc w rozwiązaniu problemu który czesto mi się pojawia. Robie >> sobie klase np >> >> class oknoText extends JTextArea >> { >> public void oknoText(String t, int x, int y, int sz, int >> wy) >> { >> JLabel b1 = new JLabel (t); >> } >> } > > Z innej beczki: nazwy klas zwykło się rozpoczynać wielką literą w > przeciwieństwie > do nazw zmiennych które rozpoczyna się małą literą, lub pisze wyłącznie > wielkimi > literami. > > Pozdrawiam, > > Leonard
Dzięki bedę stosował zgodnie z konwencją
kt
Piotr Kobzda - 23-03-2006 03:33
trzcinka wrote:
> przepraszam całego teksu nie umieściałem zeby nie "zaśmiecać" obrazu sprawy > ale jeśli takie życzenie to dołączam całą klasę
Gdzie ją dołączasz??
To co powklejałeś, to właśnie *śmieci* jakieś są! Jak próbuję to skompilować, to mam dużo innych komunikatów, tego jednak, o którym piszesz akurat nie widzę?!... Gdy tak patrzę dłużej na to coś wysłał, to nie wiem już w końcu co to jest np. 'c' i jak wyglądają inne zależności w Twoim kodzie?... i szczerze mówiąc, mało mnie to już w sumie interesuje...
Na przyszłość jednak, jeśli nie wiesz dlaczego coś się nie kompiluje, to nie tnij kodu, który ma się Twoim zdaniem skompilować i opublikuj go w całości. Gdyż możliwe, że właśnie przyczynę błędu wycinasz, a my wróżki wyobraź sobie nie jesteśmy, by zgadywać coś wyciął...
piotr
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[PostgreSQL] Komunikaty w sytuacji naruszenia=?iso-8859-2?Q?ogranicze=F1?= kluczy
probl.z komunikatem "Class definition WORD.APPLICATION is not found" w VFP 6
MSDTC =?ISO-8859-2?Q?k=B3opoty_z_komunikacj=B1?=
Szukam skryptów do serwisu o komunikatorach
[oracle] Jak wyslac komunikat do windows
Wlasny komunikat bleów w Access - Help
Adobe Bridge -denerwujący komunikat
[MySQL] komunikat - pomocy!
dziwny komunikat w corelu 9
komunikaty kwerend
zanotowane.pldoc.pisz.plpdf.pisz.plabsolwenci.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|