AWT JApplet lädt Bild nicht hoch

Javina

Mitglied
Hallo ihr Lieben,

ich bin gerade dabei ein JApplet zu programmieren, in dem ich ein Bild hochladen/anzeigen möchte.

Bisher habe ich nur Japplets programmiert, in denen ich mit drawRect() gearbeitet habe, und das hat immer gut funktioniert.

Nur mein jetziges JApplet zum Anzeigen eines Bildes von meiner Festplatte (Das Bild liegt auch im selben Verzeichnis wie mein Code und ist eine png-Datei) bleibt weiss ohne das Bild.

Mein Code sieht wie folgt aus:
Java:
import java.applet.Applet;
import java.awt.*;

public class FigurenApplet extends Applet {

             private final int GROESSE = image.getHeight();
             private final int RAND = 50;
	
             public void init() {
        	        setSize(500, 500);	    
             }
    
             public void paint(Graphics g) {
                     Image image;
                     image = getImage(getCodeBase(), "Bild.png");
                     g.drawImage(image,0,0,this);
             }
}

Es wär echt super, wenn mir jemand sagen könnte, woran das liegen kann.

Liebe Grüße,
Javina
 

L-ectron-X

Gesperrter Benutzer
ich bin gerade dabei ein JApplet zu programmieren
Nein, bist du nicht. Du schreibst ein Applet...

Ein großer Fehler ist es, die Bild-Datei in der paint()-Methode zu laden.
Dieser Vorgang kann u.U. etwas dauern, das Bild wird möglicherweise nicht gezeichnet, weil es noch nicht vollständig geladen ist. Außerdem, wird das Bild jedes Mal geladen, wenn etwas im Applet (neu) gezeichnet werden soll - eine Performance-Falle also.

Lese das Bild in der init()-Methode. In JApplets benutzt du zum Einlesen von Bildern am Besten ImageIO. In Applets benutzt du dafür den MediaTracker.
 

Javina

Mitglied
Hallo L-ectron-X,

vielen Dank für die schnelle Antwort. :)

Ok, dann mach ich das mit dem Applet SCHREIBEN mal ganz konkret:
Wir sollten vor 3 Wochen ein Programm schreiben, das das Minimum und Maximum eines 2-dim. Feldes berechnet, und dann ein weiteres Programm, das mithilfe des ersten Programms ein gegebenes Bild einmal in Graustufen und daneben einmal als "Kantenbild" anzeigt.

Mein Code lässt sich fehlerfrei übersetzen und ich hab auch volle Punktzahl drauf bekommen.
Aber: Das JApplet tut nicht das, was es soll.
Es wird nur für weniger als eine Sekunde angezeigt, und es zeigt auch nicht die zwei Bilder an, die es eigentlich anzeigen sollte.

Im Folgenden steht der Code.
Ich kann keinen Fehler im Code finden, vielleicht kann mir jemand sagen, was ich falsch mache ???:L

Das hier ist mein Programm zur Berechnung von Minimum/Maximum, welches tut was es soll:
Java:
public class MinMax2D {
	
      public static int min2D(int[][] feld) {
	int min = feld[0][0];
           	for (int i = 0; i < feld.length; i++) {
             	      for (int j = 0; j < feld[i].length; j++) {
		if (feld[i][j] < min) {
	              	min = feld[i][j];
		}
	      }
              }
	return min;
      }
	
      public static int max2D(int[][] feld) {
	int max = feld[0][0];	
	for (int i = 0; i < feld.length; i++) {
		for (int j = 0; j < feld[i].length; j++) {
			if (feld[i][j] > max) {
				max = feld[i][j];
			}
		}
	}
	return max;
      }
	
      public static void main(String[] args) {
 	int[][] feld = { {1,2,3},{4,2,-3},{3,6,3}};
              System.out.println(min2D(feld));
	System.out.println(max2D(feld));
      }

}

Das hier ist der Code der Klasse GdiImage, die es zum Runterladen gab, und die wir verwenden sollten:
Java:
package uebung;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;

public class GdiImage {
    private BufferedImage bimg = null;

    public GdiImage(final int width, final int height) {
        bimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                bimg.setRGB(x, y, Color.BLACK.getRGB());
            }
        }
    }

    public GdiImage(final String filename) {
        this.load(filename);
    }

    public GdiImage(final URL url) {
        this.load(url);
    }

    public void load(final String filename) {
        try {
            load(new File(filename).toURI().toURL());
        } catch (MalformedURLException e) {
            System.err.println(e.toString());
            System.exit(1);
        }
    }

    public void load(final URL url) {
        // load image
        try {
            bimg = ImageIO.read(url);
        } catch (IOException e) {
            System.err.println(e.toString());
            System.exit(1);
        }
    }
    
    public void save(final String filename, final String format) {
        try {
            ImageIO.write(bimg, format, new File(filename));
        } catch (IOException e) {
            System.err.println(e.toString());
            System.exit(1);
        }
    }

    public int getWidth() {
        return bimg.getWidth();
    }

    public int getHeight() {
        return bimg.getHeight();
    }

    public int[][] getPixels() {
        int width = bimg.getWidth();
        int height = bimg.getHeight();

        // copy into 2-dimensional array
        int[] data = bimg.getRGB(0, 0, width, height, null, 0, width);
        int[][] pixels = new int[height][width];
        for (int y = 0; y < height; y++) {
            System.arraycopy(data, y * width, pixels[y], 0, width);
        }

        return pixels;
    }

     public void setPixels(final int[][] pixels) {
        int width = bimg.getWidth();
        int height = bimg.getHeight();
        
        if ((height != pixels.length) || (width != pixels[0].length)) {
            System.err.println("GdiImage.setPixels(): size of both images differ!");
            return;
        }
        
        int[] data = new int[width * height];

        for (int y = 0; y < height; y++) {
            assert pixels[y].length == width : "Evil GDIler is doing nasty things.";
            System.arraycopy(pixels[y], 0, data, y * width, width);
        }

        bimg.setRGB(0, 0, width, height, data, 0, width);
    }

    public BufferedImage getImage() {
        return bimg;
    }
    
    public void draw(final Graphics g, final int x, final int y) {
        g.drawImage(bimg, x, y, null);
    }
}


Und das hier ist jetzt der Code für das JApplet mit den zwei Bildern, in dem der Wurm stecken muss, (falls ich alle Dateien im richtigen Verzeichnis abgelegt habe; und zwar liegen alle 3 Klassen, sowie das Bild, das zweimal hochgeladen und verändert dargestellt werden soll, im selben Ordner) :
Java:
import java.awt.Graphics;
import javax.swing.JApplet;
import uebung.GdiImage;

public class SobelApplet extends JApplet {
    private GdiImage image1;
    private GdiImage image2;
    private final int RAND = 10;

    public void init() {
        /* Bilder laden */
        image1 = new GdiImage("lena.jpg");
        image2 = new GdiImage("lena.jpg");
        
        /* Applet auf richtige Groesse setzen */
        int sizeX = 3 * RAND + 2 * image1.getWidth();
        int sizeY = 2 * RAND + image1.getHeight();
        setSize(sizeX, sizeY);
        
        /* Bild 1 nach Graustufen umwandeln */
        int[][] pixels = wandleBildNachGraustufen(image1.getPixels());
        image1.setPixels(pixels);
        int[][] sobelX = { { 1, 0, -1 }, { 2, 0, -2 }, { 1, 0, -1 } };
        int[][] sobelY = { { 1, 2, 1 }, { 0, 0, 0 }, { -1, -2, -1 } };
        
        /* Umwandeln */
        int[][] pixelsX = wendeMaskeAn(pixels, sobelX);
		int[][] pixelsY = wendeMaskeAn(pixels, sobelY);
		int[][] gefiltertesBild = new int[pixels.length][pixels[0].length];
		
		/* Helligkeitswert verrechnen */
		for (int i = 0; i < pixelsX.length; i++) {
			for (int j = 0; j < pixelsX[0].length; j++) {
				int wert = (int) Math.sqrt(Math.pow(pixelsX[i][j], 2)
						+ Math.pow(pixelsY[i][j], 2));
				gefiltertesBild[i][j] = wert;
			}
		}
		
		/* min/max bestimmen */
		int min = MinMax2D.min2D(gefiltertesBild);
		int max = MinMax2D.max2D(gefiltertesBild);
		
		/* Bild normalisieren und invertieren */
		for (int i = 0; i < pixelsX.length; i++) {
			for (int j = 0; j < pixelsX[0].length; j++) {
				int grau = 255 - (gefiltertesBild[i][j] - min) * 255 / (max - min);
				gefiltertesBild[i][j] = (grau << 16) + (grau << 8) + grau;
			}
		}
		image2.setPixels(gefiltertesBild);
    }
    
    public void paint(Graphics g) {
    	g.drawImage(image1.getImage(), RAND, RAND, null);
    	g.drawImage(image2.getImage(), RAND + image1.getWidth() + RAND, RAND, null);
	}
    
	public int[][] wandleBildNachGraustufen(int[][] pixels) {
		for (int i = 0; i < pixels.length; i++) {
			for (int j = 0; j < pixels[0].length; j++) {
				int rgb = pixels[i][j];
				int r = (rgb >> 16) & 255;
				int g = (rgb >> 8) & 255;
				int b = rgb & 255;
				int grau = (77 * r + 151 * g + 28 * b) / 256;
				rgb = (grau << 16) + (grau << 8) + grau;
				pixels[i][j] = rgb;
			}
		}
		return pixels;
	}
	
	public int[][] wendeMaskeAn(int[][] pixels, int[][] maske) {
		int[][] pixelsNeu = new int[pixels.length][pixels[0].length];
		int offset = maske.length / 2;
		for (int i = offset; i < pixelsNeu.length - offset; i++) {
			for (int j = offset; j < pixelsNeu[i].length - offset; j++) {
				int sum = 0;
				for (int k = 0; k < maske.length; k++) {
					for (int l = 0; l < maske.length; l++) {
						sum += (pixels[i + k - offset][j + l - offset] & 255) * maske[k][l];
					}
				}
				pixelsNeu[i][j] = sum;
			}
		}
		return pixelsNeu;
	}
	
}

Es wäre mir wirklich wichtig herauszufinden, wie es richtig geht, denn es ist überhaupt nicht zufriedenstellend, wenn man nach viel Arbeit immer kurz davor bleibt, sich auch ansehen zu können, was man tolles gemacht hat :(
 

Javina

Mitglied
Hallo,

ich hab mir jetzt Java 6 runtergeladen, weil ich gedacht hab, dass es vielleicht daran liegt, dass ich bis jetzt mit Java 5 gearbeitet hab.

Wenn ich das JApplet ausführe, erscheint auf der Konsole folgendes:
javax.imageio.IIOException: Can't get input stream from URL!

Aber ich verstehe nicht, was ich ändern muss. Denn:
Im Code der Klasse GdiImage benutze ich doch den GdiImage-Konstruktor aus Zeile 23, und nicht den aus Zeile 27.
Oder liegt das daran, dass die load-Methode aus Zeile 31 letztendlich auch über eine URL läuft?

Mein Bild liegt aber im selben Ordner wie die Code-Datei.

Hat jemand eine Idee, was falsch sein könnte? ???:L
 

Javina

Mitglied
Ich übergebe der Methode load() einen String mit dem Namen der Datei, die ich hochladen möchte, da ich ja dem GdiImage-Konstruktor als Argument einen String übergeben hab.

Ist das etwa falsch?
 

L-ectron-X

Gesperrter Benutzer
In Applets muss man fast immer über die getCodeBase()/getDocumentBase() den Pfad aufbauen.
Sobald File im Spiel ist, werden in unsignierten Applets AccessControlExceptions geworfen.
Poste bitte mal die gesamte Exception.
 

Javina

Mitglied
Hallo L-ectron-X,

ich hab den Fehler gefunden.
Das Bild, das ich hochladen wollte, lag in einem Ordner des Binary-Ordners,
und ich hab nur den Dateinamen, anstatt Ordner/Dateiname angegeben!

Trotzdem vielen Dank für deine Hilfe ! :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J JApplet und Zeichnen AWT, Swing, JavaFX & SWT 8
J JApplet, HTML und access denied exitVM.0 AWT, Swing, JavaFX & SWT 3
B JApplet AWT, Swing, JavaFX & SWT 2
P JApplet verhält sich im Browser anders als im Eclipse (AppletViewer) AWT, Swing, JavaFX & SWT 3
P JApplet Browser Tab Öffnen AWT, Swing, JavaFX & SWT 5
H Swing JApplet - HTML - ClassNotFoundException AWT, Swing, JavaFX & SWT 7
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
B JApplet zwei Panels autobreite? AWT, Swing, JavaFX & SWT 2
F Applet JApplet per html einbinden - Main class kann nicht gefunden werden AWT, Swing, JavaFX & SWT 15
B Swing JTabbedPane in JApplet -> Reiter bei Aktualisation mehrmals zu sehen AWT, Swing, JavaFX & SWT 3
M JApplet mit Java 3D Komponente AWT, Swing, JavaFX & SWT 6
J JApplet langsam wegen vielen Tooltips? AWT, Swing, JavaFX & SWT 36
R JApplet, Elemente unsichtbar AWT, Swing, JavaFX & SWT 2
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 7
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 2
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
K JApplet Probleme AWT, Swing, JavaFX & SWT 5
S [JAVA] JFrame in Applet/JApplet AWT, Swing, JavaFX & SWT 14
H JApplet will sich nicht refreshen AWT, Swing, JavaFX & SWT 10
F OpenMap und Swing in JApplet AWT, Swing, JavaFX & SWT 8
S Applet JApplet Problem AWT, Swing, JavaFX & SWT 18
C Applet JApplet - Verständnissproblem AWT, Swing, JavaFX & SWT 3
H Applet JApplet soll neues Tab im Browser öffnen AWT, Swing, JavaFX & SWT 2
G Unterschiedliche Pfadangabe zu Icons zwischen JApplet und JWindow? AWT, Swing, JavaFX & SWT 2
J Swing JApplet Designfrage AWT, Swing, JavaFX & SWT 4
J JApplet schneidet Menüleiste ab AWT, Swing, JavaFX & SWT 4
D JApplet hängt im Browser fest AWT, Swing, JavaFX & SWT 5
M JFrame in JApplet einbinden AWT, Swing, JavaFX & SWT 13
Semox Swing JApplet: Problem MouseListener Anmeldung AWT, Swing, JavaFX & SWT 3
E Bild auf JApplet AWT, Swing, JavaFX & SWT 5
Semox Swing Random Checkbox JApplet AWT, Swing, JavaFX & SWT 14
A Focus für JApplet AWT, Swing, JavaFX & SWT 7
U JPanel wechsel in JApplet AWT, Swing, JavaFX & SWT 14
R JApplet - Infos ueber Browser moeglich? AWT, Swing, JavaFX & SWT 5
V Kein Fokus für Key Bindings auf JPanel bzw JApplet AWT, Swing, JavaFX & SWT 2
S StackOverflowError bei MouseWheelListener für JApplet AWT, Swing, JavaFX & SWT 5
G JFrame in JApplet AWT, Swing, JavaFX & SWT 6
M Daten speichern mit JApplet AWT, Swing, JavaFX & SWT 9
lukas24680 JApplet und getContentPane() AWT, Swing, JavaFX & SWT 8
G paintComponent JPanel im JApplet AWT, Swing, JavaFX & SWT 2
S Alternative zu paint in JApplet AWT, Swing, JavaFX & SWT 3
R Im JFrame ein JApplet zum öffnen einer Url benutzen AWT, Swing, JavaFX & SWT 22
H JApplet fehler objekte unsichtbar. AWT, Swing, JavaFX & SWT 2
C Swing-JApplet AWT, Swing, JavaFX & SWT 3
B JDialog in JApplet AWT, Swing, JavaFX & SWT 3
P Image in JApplet geht nicht AWT, Swing, JavaFX & SWT 2
B Bild lädt nicht AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
cool_brivk24 Swing ImageIcon lädt kein Bild AWT, Swing, JavaFX & SWT 12
P JavaFX Fenster lädt nicht mehr AWT, Swing, JavaFX & SWT 4
M JavaFX Applikation lädt Scrollpanes nicht AWT, Swing, JavaFX & SWT 19
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
O ImageIcon lädt nicht AWT, Swing, JavaFX & SWT 2
B JEditorPane lädt keine Schriftfarbe in HTML AWT, Swing, JavaFX & SWT 2
E 3D-Grafik JOGL (lädt sehr lange) AWT, Swing, JavaFX & SWT 20
M JEditorPane lädt HTML ohne Bilder AWT, Swing, JavaFX & SWT 2
M JEditorPane lädt HTML ohne Bilder AWT, Swing, JavaFX & SWT 2
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
frager2345 Bild aus Dateien lesen und als Hintergrund verwenden AWT, Swing, JavaFX & SWT 2
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
N imageIcon zeigt kein Bild an AWT, Swing, JavaFX & SWT 5
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
V JavaFX Bild leer und keine Fehlermeldung AWT, Swing, JavaFX & SWT 21
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
M Bewegtes Bild im BorderLayout.CENTER AWT, Swing, JavaFX & SWT 6
C Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen AWT, Swing, JavaFX & SWT 15
C Kleineres Bild an bestimmte Koordinaten setzen AWT, Swing, JavaFX & SWT 6
S Bild neu skalieren - Bild in Bild speichern? AWT, Swing, JavaFX & SWT 6
N Bild Drehen AWT, Swing, JavaFX & SWT 1
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
J Bild von anderer Klasse will nicht laden AWT, Swing, JavaFX & SWT 1
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
T JFrame Bild einfügen AWT, Swing, JavaFX & SWT 9
M Combobox bild anklicken AWT, Swing, JavaFX & SWT 2
L Bild nicht in der Mitte AWT, Swing, JavaFX & SWT 16
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
J Swing Bild in Button AWT, Swing, JavaFX & SWT 11
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
T JavaFX Bild in Tabellenzelle AWT, Swing, JavaFX & SWT 2
Ksanatos Swing Bild (.jpg) einlesen und per Button wechseln AWT, Swing, JavaFX & SWT 9
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
MaxG. Swing Bild Button AWT, Swing, JavaFX & SWT 7
P Swing Bild Skallieren AWT, Swing, JavaFX & SWT 1
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
A Swing Bild wird nicht mehr geladen AWT, Swing, JavaFX & SWT 4
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
S Bild mit ImageIcon auf GUI verkleinern AWT, Swing, JavaFX & SWT 3
T AWT Farben in einem Bild ändern AWT, Swing, JavaFX & SWT 8
I JFrame Bild strecken und auf Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 2
F Gezeichnetes als bild speichern AWT, Swing, JavaFX & SWT 4
B 2D-Grafik Bild farblich filtern AWT, Swing, JavaFX & SWT 2
B JavaFX ImageView neues Bild zuweisen AWT, Swing, JavaFX & SWT 19
A 2D-Grafik Bild wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 24
K Bild in JFrame AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben