[Problem] Wywolywanie/Wyswietlanie obrazka

0

Witam
Od pewnego czasu siedze w javie takie drobne projekty - samouki.
Natrafilem na tutek jak zrobic prosta gre (osobiscie polecam - TUTAJ) - i mam problem z wywolaniem rysunku na aplecie.
wywala mi takie cos:

init:
deps-jar:
Compiling 1 source file to C:\Documents and Settings\xyz\Moje dokumenty\NetBeansProjects\WojnaSwiatow\build\classes
compile:
run:
Przy otwieraniu img/potworek.GIF jako null
Wystapil blad : java.lang.IllegalArgumentException input == null!
BUILD SUCCESSFUL (total time: 0 seconds)

O co chodzi z tym "java.lang.IllegalArgumentException input" ?
Od razu mowie ze obrazek znajduje sie w podanym folderze i sciezki sa prawidlowe :)

SRC:

package wojnaswiatow;

import java.awt.Canvas;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;

public class WojnaSwiatow extends Canvas {
public static final int SZEROKOSC = 800;
public static final int WYSOKOSC = 600;

public WojnaSwiatow() {
JFrame okno = new JFrame(".:Wojna Swiatow:.");
JPanel panel = (JPanel)okno.getContentPane();
setBounds(0,0,SZEROKOSC,WYSOKOSC);
panel.setPreferredSize(new Dimension(SZEROKOSC,WYSOKOSC));
panel.setLayout(null);
panel.add(this);
okno.setBounds(0,0,SZEROKOSC,WYSOKOSC);
okno.setVisible(true);
okno.addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public BufferedImage loadImage(String sciezka) {
URL url=null;
try {
url = getClass().getClassLoader().getResource(sciezka);
return ImageIO.read(url);
} catch (Exception e) {
System.out.println("Przy otwieraniu " + sciezka +" jako " + url);
System.out.println("Wystapil blad : "+e.getClass().getName()+" "+e.getMessage());
System.exit(0);
return null;
}
}
public void paint(Graphics g){
BufferedImage potworek = loadImage("img/potworek.GIF");
g.drawImage(potworek, 53, 48,this);
}

public static void main(String[] args) {
WojnaSwiatow inv = new WojnaSwiatow();
}
}
0

Chodzi o to, że url==null. Sam wymyśliłeś ten sposób czytania pliku ? Spróbuj tak

return ImageIO.read(new File("img/potworek.GIF"));

W przyszłości formatuj kod, to co przysłałeś jest prawie nieczytelne.

0

Nie sam tego nie wymyslilem robilem tak jak podaje tutek. A ze po prostu szukam nowych doswiadczen w javie nie wiem co bedzie lepsze bo jeszcze tej metody nie znam :) - to tak dla zrozumienia. Co do formatowania kodu to jak mam sformatowac zeby bylo dobrze? Dodac komenty czy poodzielac pustymi wierszami kazda klase itp?

A ten sposob wyzej nie pomogl - albo ja zle wstawiam - mam go wstawic zamiast "return null;" w klasie "loadImage" ?

0

Przede wszystkim rób wcięcia.
Ta konstrukcja

okno.addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}

w klasie JFrame, to prehistoria.
Zamiast tego napisz tak

okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Skompilowałem, i u mnie czyta plik graficzny. Zatem wbrew twoim zapewnieniem nie istnieje plik "img/potworek.GIF". Sprawdź wielkość liter jeśli to Linux, lub zapisz nazwę pliku tak "img"+File.separator+"potworek.GIF". Moja funkcja loadImage() wygląda tak:

    public BufferedImage loadImage(String sciezka)
    {
        try
        {
            return ImageIO.read(new File(sciezka));
        }
        catch (Exception e)
        {
            System.out.println(e);
            System.exit(0);
            return null;
        }
    }
0

Kurcze, zrobilem tak jak mi napisales wszystko poprawilem zamieszcze screena na ktorym widac ze plik istnieje i ze zmiany sa takie a nie inne ;) Dziekuje za pomoc
Tutaj

0

Ja nie widzę wspomnianego pliku gdzie trzeba

Compiling 1 source file to C:\Documents and Settings\xyz\Moje dokumenty\NetBeansProjects\WojnaSwiatow\build\classes

Nie znam ustawień projekt i zachowania NetBeans, ale mocno podejrzewam iż katalogiem bieżącym gdy rusza program jest
C:\Documents and Settings\xyz\Moje dokumenty\NetBeansProjects\WojnaSwiatow\build\classes zatem program szuka obrazka w C:\Documents and Settings\xyz\Moje dokumenty\NetBeansProjects\WojnaSwiatow\build\classes\img

0

Wlasnie jak chce czytac np plik txt albo z niego skorzystac kopiuje go do folderu .../src/ i dziala. Ale niestety nie moge sobie poradzic z obrazkami. w ogóle nigdzie nie znalazlem zadnego tematu tego typu zachowaniu. A wracajac do sciezki obrazka to jak mozesz zobaczyc tego pdfa w poscia na samej gorze. Moze sie czegos doszukasz :) Z gory dzieki

0

mam ten sam problem z tym, że w j2me przy pisaniu MIDletu. Kompilator sprawia wrażenie jakby w ogóle nie w chodził do bloku try {}catch{}. Wstawiłem w niego zwykły tekst do wyświetlenia na ekranie i też nic, nie wyrzuca nawet wyjątku. Wie ktoś w czym może tkwić problem?

0

Ideałem (zazwyczaj osiąganym) jest by program tworzony za pomocą IDE(NetBeans, Eclipse,..) dało się uruchomić z wnętrza IDE oraz "z ręki". Znacznie ważniejsze jest by dało się uruchomić "z ręki". Spróbuj uruchomić swój program "ręcznie": Jeżeli powstał jar, to uruchom konsolę, przejdź do katalogu z plikiem jar i wpisz java -jar nazwa_jara. Otwarcie pliku jar przez podwójne kliknięcie nie jest w tym przypadku właściwe, odpowiada ono wpisaniu polecenia javaw -jar nazwa_jara, które nie otwiera konsoli, nie zobaczysz zatem komunikatów o błędach.

0

Niestety tez nie dziala juz to wczesniej probowalem. A tak pomyslalem ze moze trzeba dodac cos do tej klasy loadimage:

public void paint(Graphics g){
BufferedImage potworek = loadImage("img/potworek.GIF");
g.drawImage(potworek, 53, 48,this);

np cos w stylu throws IOException czy cos w tym stylu. Probowalem to wpisac ale mysle ze do biblioteki javax.imageio idzie to calkiem inaczej.

0

Takie rozwiązanie

public void paint(Graphics g)
{
   BufferedImage potworek = loadImage("img/potworek.GIF");
   g.drawImage(potworek, 53, 48,this);

to zupełna głupota,

BufferedImage potworek = loadImage("img/potworek.GIF");

powinno być wykonane jeden raz na starcie programu.
W widoku z NetBeans, który umieściłeś wcześniej jest

loadImage("img"+File.separator+"potworek.GIF");

teraz wróciłeś do

loadImage("img/potworek.GIF");

Przecież to jest linuksowy format ścieżki, a ty masz Windows. Niektóre funkcje czytające pliki graficzne akceptują w widowsach format linuksowy. Bezpeieczniej jednak użyć File.separator, wartość
File.separator zależy od systemu: dla Linuksa jest to "/", dla Windows "\".

0

Juz wiem! Teraz pomyslalem sobie o Tym zeby skopiowac obrazek na C: i zamiast

BufferedImage potworek = loadImage("img/potworek.GIF");

dacBufferedImage potworek = loadImage("C:\potworek.gif");

 i zadzialalo. Pozniej powsadzalem do kazdego katalogu projektu obrazek i poprostu napisalem <code class="java">BufferedImage potworek = loadImage("potworek.GIF");

i pokolei usuwalem z kazdego katalogu po obrazku i wkoncu mi wyszlo :)
Sciazka do obrazka byla standardowo w katalogu C:\Documents and Settings\xyz\Moje dokumenty\NetBeansProjects<b>WojnaSwiatow</b> :) Dziekuje bardzo za wszelkie wskazowki i podpowiedzi :)

Teraz mam tak:

BufferedImage potworek = loadImage("src/wojnaswiatow/img/potworek.gif");

Moja wina ze nie poszukalem dokladnie

0

Witam mam podobny problem tyle ze w dalszej czesci tego kursu. Wszystko wczytywało sie tak jak mialo az do momentu kiedy miałem zrobic animacje potworka. Przy otwieraniu img/null jako null
Wystapil blad : java.lang.IllegalArgumentExceptioninput == null!

SpriteCache.java

java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import java.util.HashMap;
import javax.imageio.ImageIO;


public class SpriteCache {

public HashMap sprites;

public SpriteCache(){
    sprites = new HashMap();
}

private BufferedImage loadImage(String sciezka) {
    URL url=null;
    try {
        url = getClass().getClassLoader().getResource(sciezka);
        return ImageIO.read(url);
    } catch (Exception e){
        System.out.println("Przy otwieraniu " + sciezka +" jako " + url);
        System.out.println("Wystapil blad : "+e.getClass().getName()+""+e.getMessage());
        System.exit(0);
        return null;
    }
  }

public BufferedImage getSprite(String sciezka){
    BufferedImage img = (BufferedImage)sprites.get(sciezka);
    if (img == null) {
        img = loadImage("img/"+sciezka);
        sprites.put(sciezka,img);
    }
    return img;

}
}

Monster.java

public class Monster extends Actor {
    protected int vx;

    public Monster(Stage stage){
        super(stage);
        setSpriteNames( new String[] {"potworek0.gif","potworek1.gif"});
        setFrameSpeed(25);
    }

    public void act() {
        super.act();
        x+=vx;
        if (x < 0 || x > Stage.SZEROKOSC)
            vx = -vx;
    }
    public int getVx() { return vx; }
    public void setVx(int i) {vx = i;}

}

Prosiłbym o pomoc, gdyz zastosowałem sie do wczesniej udzielonych porad, ale niestety dalej to samo. Z góry dziękuję.
Pozdrawiam

0

Witam!:)
Mam ten sam problem co kolega powyżej:( Nikt nie udzielił jak do tej pory odpowiedzi na jego pytanie:( Może jednak ktoś z Was wie jak rozwiązać ten problem?

0

spróbujcie ścieżkę, która będzie przeszukiwać od głównego projektu... przykład:
getClass().getResource("/resources/prev.gif")

0

Przepraszam że odkopuję ale czy ktos znalazł rozwiazanie problemu z wczytaniem kilku obrazków ?

0
msk68 napisał(a):

Witam mam podobny problem tyle ze w dalszej czesci tego kursu. Wszystko wczytywało sie tak jak mialo az do momentu kiedy miałem zrobic animacje potworka. Przy otwieraniu img/null jako null
Wystapil blad : java.lang.IllegalArgumentExceptioninput == null!

SpriteCache.java

java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import java.util.HashMap;
import javax.imageio.ImageIO;


public class SpriteCache {

public HashMap sprites;

public SpriteCache(){
    sprites = new HashMap();
}

private BufferedImage loadImage(String sciezka) {
    URL url=null;
    try {
        url = getClass().getClassLoader().getResource(sciezka);
        return ImageIO.read(url);
    } catch (Exception e){
        System.out.println("Przy otwieraniu " + sciezka +" jako " + url);
        System.out.println("Wystapil blad : "+e.getClass().getName()+""+e.getMessage());
        System.exit(0);
        return null;
    }
  }

public BufferedImage getSprite(String sciezka){
    BufferedImage img = (BufferedImage)sprites.get(sciezka);
    if (img == null) {
        img = loadImage("img/"+sciezka);
        sprites.put(sciezka,img);
    }
    return img;

}
}

Monster.java

public class Monster extends Actor {
    protected int vx;

    public Monster(Stage stage){
        super(stage);
        setSpriteNames( new String[] {"potworek0.gif","potworek1.gif"});
        setFrameSpeed(25);
    }

    public void act() {
        super.act();
        x+=vx;
        if (x < 0 || x > Stage.SZEROKOSC)
            vx = -vx;
    }
    public int getVx() { return vx; }
    public void setVx(int i) {vx = i;}

}

Prosiłbym o pomoc, gdyz zastosowałem sie do wczesniej udzielonych porad, ale niestety dalej to samo. Z góry dziękuję.
Pozdrawiam

Pozwole sobie odkopac temat.

Tez sie za to wzialem i doszedlem do wniosku, ze ten blad spowodowany jest metoda malowania w klasie actor :

public void paint(Graphics2D g){
		
		
		g.drawImage( spriteCache.getSprite(spriteName), x,y, stage );
		
		}

Metoda ta chce malowac cos czego nie ma gdyz spriteName ma wartosc Null stad komunikat "Przy otwieraniu img/null jako null", niestety glowilem sie jak to zmienic i nie wpadlem na zaden pomysl (po zmianie w tutku metody na spriteNames ). Prosba do bardziej zaawansowanych uzytkownikow o pomoc.

Ponizej moj kod

http://wklej.to/RpwaA

Update : W koncu udalo mi sie dojsc w czym problem linijka o ktorej mowa wyzej powinna wygladac nastepujaco :

"g.drawImage( spriteCache.getSprite(spriteNames[currentFrame]), x,y, stage );"

Gdy zmieniamy animacje obrazka rowniez w tym miejscu nastepuje jego zmiana czego udzialem jest wartosc currentFrame (w tutku domyslnie 0 lub 1) jest tam po prostu blad.

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