Bilder aktualisieren

toothpick192

Grünschnabel
Hallo,
ich habe ein kleines Probelm. Ich habe einen Frame auf dem unter anderem auch ein Bild mit einem JFileChooser geladen werden kann. Ich bekomme das auch alles hin nur ich krieg das angezeigte Bild dann im Frame nicht aktualisiert. Kann mir einer nen Tip oder nen evtl nen link zu nem tutorial ? ich hab irgendwie nichts - mir verständliches - gefunden.

Mit Dank im Voraus,

Christian

Edit:

hiermit erzeuge ich ein Panel was ich dann dem eigentlichen Frame hinzufüge

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;


public class ImgComp extends JPanel{

private BufferedImage image ;

public ImgComp(BufferedImage image) {
this . image = image;
}

@Override
public Dimension getPreferredSize() {
//return new Dimension(image.getWidth(null), image.getHeight(null));
return new Dimension(240,320);
}

@Override
public void paintComponent(Graphics g) {
super .paintComponent(g);
BufferedImage thumbImage = new BufferedImage(240,320, BufferedImage. TYPE_INT_RGB);
Graphics2D graphics2D = thumbImage.createGraphics();
graphics2D.setRenderingHint(RenderingHints. KEY_INTERPOLATION ,
RenderingHints. VALUE_INTERPOLATION_BILINEAR );
graphics2D.drawImage( image , 0, 0, 240,320, null );

g.drawImage(thumbImage,0,0, this );
}
}
 
Zuletzt bearbeitet:
Hallo,

wie meinst du das, dass du das Bild nicht aktualisiert bekommst?

Benutze doch bitte nächstes mal die Code-Tags.

MFG

zEriX
 
Hallo,
sorry ich hab extra noch geguckt nach Code-Tags. Hab ich wohl beim editieren übersehen. Kommt nicht wieder vor ;)

Ich möchte, dass wenn ein neues Bild ausgewählt wird, dies auch im Frame dann angezeigt wird. Im Moment mache ich es noch so, dass wenn ein neues Bild ausgesucht wird, der aktuelle Frame komplett disposed() wird und ein neuer Frame mit dem neuen Frame geöfftnet wird. das ist aber unpraktisch und kann auch nicht sonderlich performant sein :(

Jetzt bin ich grad dabei das entsprechende Component zu "nullen" und dann ein neues Component mit dem aktualisierten Bild zu generieren. Ich schaff es nur nicht, dass es dann auch im Frame angezeigt wird. Irgendwie funktioniert this.repaint() nicht :(

Christian
 
Mach doch einfach eine Setter-Methode für dein Image. Dann wird nachher automatisch das neue Bild gezeichnet.

MFG

zEriX
 
meinst du in der von mir geposteten Klasse ? Ich kann eine zwar eine setter() Methode hier setzen, aber wie aktualisiert sich das Bild dann automatisch ?

Christian
 
Versuch es mal mit dieser Klasse.

Code:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class ImgComp extends JPanel {

	private Image image;
	private Image imageToPaint;

	public ImgComp(BufferedImage image) {
		setImage(image);
	}

	@Override
	public Dimension getPreferredSize() {
		// return new Dimension(image.getWidth(null), image.getHeight(null));
		return new Dimension(240, 320);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(imageToPaint, 0, 0, this);
	}

	public Image getImage() {
		return image;
	}

	public void setImage(BufferedImage image) {
		this.image = image;
		
		imageToPaint = new BufferedImage(240, 320,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D graphics2D = (Graphics2D)imageToPaint.getGraphics();
		graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
				RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		graphics2D.drawImage(image, 0, 0, 240, 320, null);
	}
}

Mit dieser Klasse müsste es funktionieren.
MFG

zEriX
 
Zuletzt bearbeitet:
Hallo nochmal,
erstmal vielen Dank für Deine schnelle Hilfe. Ich habe jetzt zwar nicht Deinen Code benutzt, sondern den Tip von Dir umgesetzt einfach eine setter() Methode zu schreiben. Und tatsächlich, es funktioniert jetzt einwandfrei. Vieln Dank dafür !

Jetzt stellt sich mir eigentlich nur noch die Frage warum das so ist... Welches Objekt "bemerkt" denn jetzt, dass eine Änderung stattgefunden hat ? Ich meine irgenwie muss ja die paint() Methode nochmal aufgerufen werden, oder ? Wer oder was macht denn das ?

Nochmals vielen Dank für die (vor allem schnelle) Hilfe,
Christian
 
Die paint-Methoden werden ja nicht nur einmal aufgerufen, sondern bei jedem repaint. Das heißt, wenn von dir ein repaint aufgerufen wird oder sobald du irgendwo in die Oberfläche klickst oder irgendwas an der Oberfläche machst. Dann wird natürlich auch jedes mal das Bild neu gezeichnet. Wenn sich das Bild dann verändert hat, wird natürlich das neue Bild gezeichnet.

Ein Rat von mir wäre noch, dass du das was du in der paintComponent-Methode machst in der Setter-Methode machst. So wird es nämlich nur einmal gemacht und nicht immer wenn es neu gezeichnet wird. Bei einem Bild macht das zwar keinen so großen unterschied, aber es ist schon etwas performanter.

Schau dir einfach mal die Klasse von mir an.

MFG

zEriX
 
Zurück