Portál AbcLinuxu, 10. května 2025 05:28
V mem programu nacitam obrazky (jpg, png). Tyto obrazky jsou uvnitr vysledneho .jar souboru, proto je nacitam takto:
imageIcon = new ImageIcon(getClass().getResource(filename));
Pak jsem se rozhodl, ze dovolim uzivatelovi si nacist i vlastni obrazky, ktere ma ulozene nekde v filesystemu. Uzivatelovi tedy vybehne filechooser, on zvoli nejaky obrazek a jeho filename prijde do funkce, ktera obsahuje radek nahore. Jenze ten mi hodi chybu, ze obrazek nemuze najit. Na obrazky nacitane externe (mimo jar) mi funguje toto:
imageIcon = new ImageIcon(filename);
Proto jsem problem docasne (vim ze je to strasne prasarna) vyresil takto:
try { imageIcon = new ImageIcon(getClass().getResource(filename)); } catch (NullPointerException ex) { imageIcon = new ImageIcon(filename); }
Ted jsem z toho ale zmateny, proc musim pouzivat dva ruzne zpusoby nacitani obrazku? Existuje nejaky zpusob, kdy je jedno jestli obrazek nacitam z jar nebo externe?
Konstruktor třídy ImageIcon přijímá URL což je váš filename
. Takže stačí udělat obecnou metodu:
ImageIcon icon = getImageIcon(URL filename);
Tato metoda přijme URL a načte ikonku z obecné URL. Před zavoláním metody dáte do filename jenom příslušnou URL, buď voláním getClass().getResource(filename)
a převedete na URL. Nebo z fileChooseru new URL(filename)
.
Vami popisovany zpusob funguje v prvnim pripade (getClass().getResource(filename)
), ale v pripade fileChooseru dostanu tuto chybu:
java.net.MalformedURLException: no protocol: /home/wikidog/Downloads/pict/tree.jpg
Dany radek vypada takto:
loadImage(new URL(fc.getSelectedFile().toString()));
File
má metodu toURI()
, z URI
získáte URL
voláním toURL()
. Váš kód je špatně, protože konstruktoru URL
se jako parametr předává textové url, ne cesta k souboru.
Jak se lisi textova url od cesty k souboru?
/etc/passwd
, URL je file:///etc/passwd
.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.