Kann man im Thread Bilder laden?

Bud

Aktives Mitglied
Hallo Leute!

Leider muss ich in einem Thread ein Bild laden und es im Applet darstellen. Ich habe das per "drawImage" versucht, aber es hat leider nicht funktioniert.

Andere Grafikfunktionen sind problemlos, nur "drawImage" geht nicht. Woran kann das liegen? Am Imageobserver?

Habt ihr eine Idee? Es wäre toll, wenn jemand mir Weiterhelfen könnte.

Java:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Image;
import java.awt.image.ImageObserver;
import java.awt.image.MemoryImageSource;

public class at4 extends Applet implements MouseListener, MouseMotionListener {
	int width, height;
	int mx, my; // the mouse coordinates
	int bh, bb, testx, testy;
	Image img;
	Graphics buffergrafikausgabe;
	Image buffergrafik;
	int x = 0, y = 0;

	public void init() {
		width = getSize().width;
		height = getSize().height;
		setBackground(Color.black);
		addMouseMotionListener(this);
		buffergrafik = createImage(width, height); 
		buffergrafikausgabe = buffergrafik.getGraphics();
		img = this.getImage(getDocumentBase(), "Bild1.jpg");
	}

	public void mouseMoved(MouseEvent e) { 
		mx = e.getX();
		my = e.getY();
		testx = mx + bb;
		testy = my + bh;
		repaint();
		new AAA(this, mx, my, 5, 5, buffergrafikausgabe, img);
		e.consume();
	}

	public void paint(Graphics g) {
		buffergrafikausgabe.setColor(Color.red);
		g.drawImage(buffergrafik, 0, 0, this);
	}

	public void update(Graphics g) {
		paint(g);
	}
}

class AAA extends Thread implements ImageObserver {
	int xPos, yPos, bb, bh; /* position of the target */
	Applet myMaster; /* who to repaint */
	Graphics xx; /* Graphics to draw on */
	Image imgX;

	public AAA(Applet a, int x, int y, int bb, int bh, Graphics g, Image img) {
		xPos = x;
		yPos = y;
		myMaster = a;
		xx = g;
		start();
		imgX = img;
	}

	public void init() {
	}

	public void run() {

		int i,r;

		xx.setColor(Color.blue);
		for (i = 10; i > -20; i -= 20)
			xx.drawRect(xPos, yPos, 5, 5);
		xx.drawImage(imgX, xPos, yPos, xPos + 5, yPos + 5, xPos, yPos,
				xPos + 5, yPos + 5, this);
		myMaster.repaint();
		try {
			sleep(200);
		} catch (InterruptedException e) {
		}
	}
}
 

sambalmueslie

Bekanntes Mitglied
Naja ich würde mal sagen, deine "run()" Methode wird genau einmal durchlaufen und dann ist der Thread auch schon zu Ende.

Helfen könnte evtl:

Java:
public void run() {
      while(running){
        int i,r;
 
        xx.setColor(Color.blue);
        for (i = 10; i > -20; i -= 20)
            xx.drawRect(xPos, yPos, 5, 5);
        xx.drawImage(imgX, xPos, yPos, xPos + 5, yPos + 5, xPos, yPos,
                xPos + 5, yPos + 5, this);
        myMaster.repaint();
        try {
            sleep(200);
        } catch (InterruptedException e) {
        }
      }
}

Gruß Oli
 

Michael...

Top Contributor
Ist das nur ein Code Bsp oder der tatsächliche Code? Aus diesem wird nicht klar warum das Zeichen des Bildes in einem extra Thread ablaufen muss.

Ausserdem wird der Thread gestartet (Zeile 58) bevor die Referenz auf das Image übergeben wurde (Zeile 59)

Und diese Variablenbezeichner sind grausam.

Und ich würde nicht die paint() des Applets überschreiben, sondern eine Komponente in das Applet einfügen und deren paint() überschreiben.
 
Zuletzt bearbeitet:

Bud

Aktives Mitglied
Moin Sambalmuesli,

Die Run-Methode wird bei jeder Instanz von AAA durchgeführt. Das reicht mir auch - Das Problem ist aber, dass in dem Thread "drawRect" ausgeführt wird, aber "drawImage" eben nicht.

P.S. ich habe den Code noch weiter gekürzt und werde den gleich posten.
 

sambalmueslie

Bekanntes Mitglied
So bei mir funktioniert es jetzt:

folgendes habe ich geändert:

Java:
@Override
	public void init() {
		width = getSize().width;
		height = getSize().height;
		setBackground(Color.black);
		addMouseMotionListener(this);
		buffergrafik = createImage(width, height);
		buffergrafikausgabe = buffergrafik.getGraphics();
		img = new ImageIcon("../Bild1.jpg").getImage(); //  <-- die andere Variante hat hier nix geladen
	}

und

Java:
	@Override
	public void run() {

		int i;

		xx.setColor(Color.blue);
		for (i = 10; i > -20; i -= 20)
			xx.drawRect(xPos, yPos, 5, 5);
		xx.drawImage(imgX, xPos, yPos, this);
		myMaster.repaint();
		try {
			sleep(200);
		} catch (final InterruptedException e) {
		}
	}

schau mal hier:

Drawing an Image (The Java™ Tutorials > 2D Graphics > Working with Images)

wenn ich das auf die schnelle verstanden habe, dann kopiert die andere version einen bereich des bildes wo anders hin.

aber lies lieber mal selber :)

Gruß Oli
 

Bud

Aktives Mitglied
Ist das nur ein Code Bsp oder der tatsächliche Code? Aus diesem wird nicht klar warum das Zeichen des Bildes in einem extra Thread ablaufen muss.

Hey Michael! Vielen Dank schonmal für Deine Hilfsbereitschaft! Ja, das ist nur ein Auszug. Das Applet soll an jeder Mausposition das Bild kurz einblenden und es soll dann nach 2 Sekunden wieder ausblenden. Da dieses parallel zu anderen Zeichenoperationen stattfinden soll, habe ich es in einem Thread programmiert. Ich hofe, ich habe das einigermaßen verständlich rübergebracht.

Ausserdem wird der Thread gestartet (Zeile 58) bevor die Referenz auf das Image übergeben wurde (Zeile 59)

Thanx! Das habe ich geändert - war aber leider auch nicht erfolgreich.

Ich habe den Code ein wenig mehr ausgemistet - ich hoffe er ist jetzt übersichtlicher. Mein Problem ist die folgenden Zeile:

grafikausgabe.drawImage(imgX, xPos, yPos, 15, 15, this);

Hier ist der "überarbeitete" (Ähem) Auszug:

Java:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Image;
import java.awt.image.ImageObserver;
import java.awt.image.MemoryImageSource;

public class at4 extends Applet implements MouseListener, MouseMotionListener {
	int width, height;
	Image img, buffergrafik;
	Graphics buffergrafikausgabe;

	public void init() {
		width = getSize().width;
		height = getSize().height;
		setBackground(Color.red);
		addMouseMotionListener(this);
		buffergrafik = createImage(width, height);
		buffergrafikausgabe = buffergrafik.getGraphics();
		img = this.getImage(getDocumentBase(), "face1.jpg");
	}

	public void mouseMoved(MouseEvent e) {
		repaint();
		new AAA(this, e.getX(), e.getY(), buffergrafikausgabe, img);
		e.consume();
	}

	public void paint(Graphics g) {
		buffergrafikausgabe.setColor(Color.red);
		g.drawImage(buffergrafik, 0, 0, this);
	}

	public void update(Graphics g) {
		paint(g);
	}
}

class AAA extends Thread implements ImageObserver {
	int xPos, yPos, bb, bh; /* position of the target */
	Applet myMaster; /* who to repaint */
	Graphics grafikausgabe; /* Graphics to draw on */
	Image imgX;

	public AAA(Applet a, int x, int y, Graphics g, Image img) {
		xPos = x;
		yPos = y;
		myMaster = a;
		grafikausgabe = g;
		imgX = img;
		start();
	}

	public void init() {
	}

	public void run() {
		grafikausgabe.setColor(Color.blue);
		grafikausgabe.drawRect(xPos + 20, yPos + 20, 5, 5);
		grafikausgabe.drawImage(imgX, xPos, yPos, 15, 15, this);
		// grafikausgabe.drawImage(imgX, xPos, yPos, xPos + 15, yPos + 15, xPos,
		// yPos,xPos + 15, yPos + 15, this);
		// myMaster.repaint();
	}
}

Wenn ich den Code in Eclipse laufen lasse, bekomme ich folgende Fehlermeldung:

at AAA.imageUpdate(at4.java:39)
at sun.java2d.pipe.DrawImage.imageReady(Unknown Source)
at sun.java2d.pipe.DrawImage.scaleImage(Unknown Source)
at sun.java2d.SunGraphics2D.drawImage(Unknown Source)
at sun.java2d.SunGraphics2D.drawImage(Unknown Source)
at AAA.run(at4.java:60)

Ich bin leider zu blöd diese Fehlermeldung richtig zu deuten. Muss ich den Imageobserver übergeben?!
 

Bud

Aktives Mitglied
So bei mir funktioniert es jetzt:

folgendes habe ich geändert:

Java:
		img = new ImageIcon("../Bild1.jpg").getImage(); //  <-- die andere Variante hat hier nix geladen
	}
i

Hey Olli!

KLASSE, VIELEN VIELEN VIELEN DANK!!

:applaus: :applaus: :applaus: :applaus: :applaus: :applaus:

Genau das war es. Du hast mich gerettet und Dank Deiner Hilfe kann ich heute ein wenig früher ins Bett gehen.

Ich verstehe zwar nicht, wieso es mit "getDocumentBase" nicht funktioniert, aber da mache ich mich morgen einen Kopf.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
S Methoden Multi-Thread und Methoden Objects. Java Basics - Anfänger-Themen 1
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Thread-Frage Java Basics - Anfänger-Themen 2
E Was ist ein idle-thread? Java Basics - Anfänger-Themen 1
D Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 8
J Threads Prozess in Thread auslagern Java Basics - Anfänger-Themen 2
G Thread mehrmals starten und schliessen Java Basics - Anfänger-Themen 6
F Thread Koordination (Vorteile/Nachteile) Java Basics - Anfänger-Themen 0
O Thread aus dem Thread stoppen Java Basics - Anfänger-Themen 6
O Swingworker/Thread Java Basics - Anfänger-Themen 3
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
S musik in eigenem thread Java Basics - Anfänger-Themen 2
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
IngoF GUI mit Thread Daten austauschen. Java Basics - Anfänger-Themen 6
L Compiler-Fehler Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben