În ceea ce privește un JButton și un ImageIcon

În prezent, citesc o carte despre java, și în prezent studiez componentele interfeței grafice de tip swing. În timp ce făceam asta, am dat peste un exemplu de cod, în care autorul fixa o imagine pe un JButton într-un mod foarte neobișnuit, descris mai jos:

Icon bug1 = new ImageIcon( getClass().getResource( "bug1.gif" ) );

Pentru ca lucrurile de mai sus să funcționeze, trebuie să aveți imaginea în același director ca și fișierele .class. Poate cineva să-mi explice de ce folosește acest cod special (care, din câte știu, trebuie să fie codul de reflecție, dar din nou, nu sunt sigur în mod special față de acesta) și dacă există o cale de a face același lucru, fără a face lucrurile la fel de complicate ca el?

0

3 răspunsuri

Lucrurile sunt complicate numai dacă nu le înțelegeți. După ce ați înțeles ce face codul de mai sus, va fi extrem de simplu.

getClass() returns the Class object of the current object (this). getResource() called with a relative path as above, looks for a file, in the classpath, named bug1.gif, and in the same package as the Class object being called. So it looks for bug1.gif in the same package as the class containing the above code. getResource() returns a URL. And the ImageIcon constructor takes a URL as argument, loads the image bytes from this URL, and constructs an ImageIcon from these bytes.

Deci, totul creează doar un ImageIcon dintr-un fișier disponibil din clasa de clasă, în același pachet ca și clasa care apelează acest cod. Și acest lucru are sens: puneți imaginile utilizate de o anumită clasă în același pachet ca și clasa și eliberați un borcan care conține clasele și imaginile aplicației.

V-ați fi gândit singur la toate acestea, citind javadocul tuturor acestor metode.

0
adăugat
Bună ziua, vă mulțumesc pentru răspunsul dvs., am înțeles deja ceea ce a făcut codul de mai sus, bine, într-un sens cel puțin, dar am vrut pe cineva mai bine la asta decât să-mi explic, pentru ca eu să văd dacă l-am primit chiar de la început. Vă mulțumim din nou pentru răspunsul dvs. clarificator.
adăugat autor NlightNFotis, sursa
Îmi dau seama că nu am răspuns cu adevărat la îndoielile și la întrebările tale: nu există un mod mai simplu sau mai ușor de a face acest lucru (dar nu văd cum ar putea fi mai simplu) și nu este deloc un mod neobișnuit: de a face acest lucru.
adăugat autor JB Nizet, sursa

Class#getResource(String) returns an URL to resource from the classpath. This is a convinient way of loading resources that are stored inside your application JAR file. If the image lies somewhere on the HDD, you can load it using:

new ImageIcon(new File("/path/to/the/image").toURI().toURL());

care creează obiectul File și devine calea ca adresă URL (care va arăta ca file: /// cale/către/imagine ).

Sau mai ușor, deoarece ImageIcon are un contructor care are un nume de fișier:

new ImageIcon("/path/to/the/image");
0
adăugat
"o imagine pe un JButton" indică faptul că este o resursă încorporată. File obiectele nu sunt potrivite pentru a accesa resurse într-un Jar.
adăugat autor Andrew Thompson, sursa
Asta e mai bine.
adăugat autor Andrew Thompson, sursa
De aceea am scris în mod specific dacă imaginea se află undeva pe HDD . Deschiderea fișierelor (resurselor) din clasa de clasă din Java este supracomplicată și poate fi greu de înțeles pentru un începător (mi-a luat ceva timp), am vrut doar să simplific acest caz, arătând cum funcționează cu fișierele externe care - - este mai ușor de înțeles.
adăugat autor npe, sursa
Cred că folosind toURI() .toURL() este cazul când numele fișierului conține caractere care trebuie scoase pentru URL. Care este rareori cazul. Sau puteți explica?
adăugat autor npe, sursa
Am testat-o ​​și ImageIcon încarcă fișierul corect cu file.toURL() , chiar dacă numele fișierului conține spații. Cu toate acestea, aveți dreptate, că nu este un exemplu bun de urmat. Și File # toURL() este de asemenea depreciat. Am fixat codul.
adăugat autor npe, sursa

Swing-ul Java poate trece foarte complicat și cred că de fapt folosește acest cod pentru simplitate.

Dacă calea imaginii este relativă (calea din exemplul dvs. este), imaginea trebuie să fie localizată în aceeași locație ca și codul octet al programului dvs., fișierele .class. Dacă imaginea era în altă parte, programul dvs. pur și simplu nu a putut să o găsească.

Căile relative asemănătoare sunt foarte utile, mai ales atunci când doriți să vă compilați proiectul finalizat într-un fișier JAR. Imaginea dvs. va fi inclusă în JAR cu toate fișierele .CLASS. Veți putea să descărcați programul dvs. de compilare, să-l rulați și imaginile dvs. vor fi acolo în GUI așa cum v-ați aștepta.

0
adăugat