[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.

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