niewidoczne bitmapy w pilku .jar

0

Witam

Mam projekt w eclipse w którym w osobnymfolderze o nazwie bitmaps znajdują sie wszystkie pliki.png, które są używane w programie ,mianowicie jako ikony do JButton. Befiniuje je jako
.setIcon(new ImageIcon("./bitmaps/NazwaPliku.png");

w eclipse to działa, ale jak wyeksportuje projekt do pliku .jar to niestety bitmapy nie są widoczne.

Próbowałem juz

getClass().getClassLoader().getSystem("./bitmaps/NazwaPliku.png");

ClassLoader.getSystemResource("./bitmaps/NazwaPliku.png");

bez kropki na początku ścieżki też a nawet \ zamiast / i żaden sposób nie przynosi oczekiwanego rezultatu.
Jeśli ktoś wie w czym problem proszę o pomoc. Z góry dzięki.

Pozdrawiam

0

Nie bardzo rozumiem. Pliki graficzne też są w pliku jar ?

0

Tak

0

Ja używam takiej funkcji (u mnie jest w klasie narzędziowej, dlatego public static

    public static ImageIcon readIcon(String nameOfFile,String nameOfPicture,boolean seekFile)
    {
        ImageIcon ikona=null;
        try
        {
            JarFile jf=new JarFile(nameOfFile);
            ZipEntry ze=jf.getEntry(nameOfPicture);
            InputStream is=jf.getInputStream(ze);
            byte[] bufor=new byte[(int) ze.getSize()];
            is.read(bufor);
            is.close();
            ikona=new ImageIcon(bufor);
        }
        catch (IOException e)
        {
            if (seekFile)
            {
                ikona=new ImageIcon(nameOfPicture);
            }
        }
        return ikona;
    }
0

Obawiam się że to nie przejdzie u mnie ale dzięki za info

Pozdrawiam

0

Dlaczego ???

0

A ClassLoader.getResource() / getResourceAsStream() nie dziala?

0

Dlatego bo musiał bym za bardzo zmieniać kod

Jeśli chodzi o pytanie Pikselozy to żadne z metod nie działają.

Myślę że problem może leżeć w pliku manifest.mf. Tam są tylko 2 klauzule:

Manifest-Version i Main-class, nie ma nic o zew plikach, być może trzeba dodać coś w ustawienia eclipsa

0

Zamiana (w kilku, kilkunastu) miejscach

setIcon(new ImageIcon("./bitmaps/NazwaPliku.png");

na

setIcon(readIcon("./bitmaps","NazwaPliku.png");

jest taka pracochłonna ?

    private ImageIcon readIcon(String nameOfPicture,String nameOfFile)
    {
        ImageIcon ikona=null;
        try
        {
            JarFile jf=new JarFile(nameOfFile);
            ZipEntry ze=jf.getEntry(nameOfPicture);
            InputStream is=jf.getInputStream(ze);
            byte[] bufor=new byte[(int) ze.getSize()];
            is.read(bufor);
            is.close();
            ikona=new ImageIcon(bufor);
        }
        catch (IOException e)
        {
        }
        return ikona;
    }
0

Poprawka, na

setIcon(readIcon("./bitmaps/NazwaPliku.png","NazwaPliku.jar");
0

Ale o co cjodzi?

package test;

import java.awt.FlowLayout;

public class Test {

    public static void main(String[] args) throws Exception {
        JFrame frame = new JFrame();
        frame.setLayout(new FlowLayout());
        JButton b = new JButton("Img");
        b.setIcon(new ImageIcon(Test.class.getResource("/img/square.png")));
        frame.add(b);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

W katalogu img jest plik graficzny. Wszytsko dziala i w eclipse, i po wyeksportowaniu do jara, poniewaz w abu przypadkach plik (resource) znajduje sie w classpath.
Co do pomyslu bogdansa to teza mysle ze fajnie wprowadzic pewien poziom abstrakcji i wczytywac ikonki jakas zewnetrzna metodka, nie uwazam jednak ze nalezy sie tak bawic jakimis ZipEntry itp, przeciez sa od tego standardowe funkcjonalnosci javy (Class.getResource() i getResourceAsStram().

0

Ja wole takie rozwiązanie, że program jest w dwóch plikach: Klasy.afr i Resources.jar (Resources.zip). Ten drugi zawiera potrzebne pliki graficzne, pliki pomocy, ... i do odczytanie ikony z tego drugiego pliku jest mi potrzebna opisana wyżej metoda.

0

Jak dodasz Resources.jar/.zip do classpath to zadziala i moj sposob z Class.getResource(). Ale w porzadku, w zadneym razie nie krytykuje tego podejscia, ma swoje zastosowania.
Pozdro.

0

IMO poprawne działanie "produkcyjnej wersji" programu nie powinno zależeć od wartości zmiennej classpath.
pozdrawiam

0

Kapitanie Bomba, spotkałem się z problemem, że pod Vistą pliki png (i tylko png) nie były wczytywane (sypało wyjątkami podobno; podobno, bo znajomy testował i coś mi się tak kojarzy, że mówił o wyjątkach - było to jakieś 2-3 miesiące temu). Pliki jpg były wczytywane bez problemu. Pod XP i Linuksem (Debian lenny) wszystko było OK.

0

@bogdans: rozumiem ze wszystkie Twoje projekty skladaly sie z jednego jara? Nie uzywales zadnych bibliotek zewnetrznych? To zyjesz w idealnym swiecie gdzie koder sam tworzy swoj kod i ma nad nim calkowita kontrole, nie doswiadcza dependency hell, problemow z wersjonowaniem, itp. Pozazdroscic.

0

Zgoda, żyję w wyidealizowanym świecie. Zgadzam się, że w dużym projekcie jest niezbędne uzależnienie działania programu od właściwej wartości classpath. Ale nadal uważam, że zmiana classpath polegająca tylko na dołączeniu pliku Resources.zip jest nieuzasadniona.

1 użytkowników online, w tym zalogowanych: 0, gości: 1