Portál AbcLinuxu, 4. listopadu 2025 15:39
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.