Image laden und Speichern - Image wird auf JPanel nicht angezeigt

Crite

Mitglied
Hi Leute,
ich hab die Klassen TrainIRW und ImageMenu.
Mein Ziel ist es, über den Menubutton "load Image" das Bild in mein JPanel zu bekommen.
Mit dem "save Image" speicher ich das Bild z.B auf meinem Desktop.
Nun habe ich das Problem, dass er mir das Bild auf meinem JPanel NICHT anzeigt, aber speichern geht.
Wenn ich aber das Objekt TrainIRW übergebe und nicht das Image von TrainIRW, dann funktionierts.

Nun würde ich gerne wissen, warum das so ist.

Java:
public class TrainIRW extends JPanel{
	
	private final static long serialVersionUID = 1L;
	protected Image img;
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(img, 0, 0, null);
	}
	
	public static void main(String[] args) {
		
		TrainIRW tIRW = new TrainIRW();
		
		JFrame frame = new JFrame("Tain IRW");
		frame.setJMenuBar(new ImageMenu(tIRW));
		Container con = frame.getContentPane();
		con.add(tIRW);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(800, 600);
		frame.setVisible(true);
	}
	
}

class ImageMenu extends JMenuBar{
	
	private final static long serialVersionUID = 1L;
	protected BufferedImage bi;
	protected File file;
	
	public ImageMenu(TrainIRW tIRW){
		JMenu menu = new JMenu("File");
		
		JMenuItem loadItem = new JMenuItem("load Image");
		JMenuItem saveItem = new JMenuItem("save Image");
		
		loadItem.addActionListener(e->{
			loadImg(tIRW.img); //hier nur tIRW, dann funktionierts
			tIRW.repaint();
		});
		
		saveItem.addActionListener(e->{
			saveImg();
		});
		
		menu.add(loadItem);
		menu.add(saveItem);
		add(menu);
	}
	
	private void loadImg(Image img){ //hier TrainIRW  tirw übergeben
		try{
			file = new File("...png"); //Musterpath
			bi = ImageIO.read(file);
					
			System.out.println("Image successfully loaded from " + file.getPath());
		}catch(IOException e){
			e.printStackTrace();
		}
		img = bi; //hier tIRW.img, dann funktionierts
	}
	
	private void saveImg(){
		file = new File("c:..."); //Musterpath
		try{
			ImageIO.write(bi, "png", file);
			
			System.out.println("Image successfully saved in " + file.getPath());
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

Ich hoffe, da blickt jemand durch meinen Code, auch wenn die Variablennamen nicht gut gewählt sind und die Struktur nicht allzu sauber ist.
 
Zuletzt bearbeitet von einem Moderator:

X5-599

Top Contributor
Es liegt daran dass java kein direktes Call by Reference hat. Du versuchst das übergebene Image Objekt durch ein anderes zu überschreiben
Code:
img = bi; //hier tIRW.img, dann funktionierts
. Da aber nur eine Kopie der Reference an die "loadImg()" Methode übergeben wird, ändert sich das Ursprungsobjekt nicht.
Dass es mit einem übergebenen Panel Objekt funktioniert liegt daran, dass zwar auch hier eine Kopie der Reference übergeben wird, du aber eine Eigenschaft des Panel Objektes veränderst. Nämlich das Image darin.

Man kann also übergebene Objekte verändern (Membervariablen ändern/oder per Methoden zb. setter) und diese Änderungen sind auch für anderen Stellen ersichtlich, die dieses Objekt kennen.
Man kann aber nicht das komplette Objekt durch ein neues ersetzen. (Man "kann" natürlich schon, aber alle anderen Stellen, die das Ursprungs Objekt kennen bekommen davon nichts mit).


Dieses Thema ist schon etwas komplex. Wenn ich also mit meiner Begriffswahl falsch liege, möge man mich bitte darauf hinweisen.
 

Crite

Mitglied
Es liegt daran dass java kein direktes Call by Reference hat. Du versuchst das übergebene Image Objekt durch ein anderes zu überschreiben
Code:
img = bi; //hier tIRW.img, dann funktionierts
. Da aber nur eine Kopie der Reference an die "loadImg()" Methode übergeben wird, ändert sich das Ursprungsobjekt nicht.
Dass es mit einem übergebenen Panel Objekt funktioniert liegt daran, dass zwar auch hier eine Kopie der Reference übergeben wird, du aber eine Eigenschaft des Panel Objektes veränderst. Nämlich das Image darin.

Man kann also übergebene Objekte verändern (Membervariablen ändern/oder per Methoden zb. setter) und diese Änderungen sind auch für anderen Stellen ersichtlich, die dieses Objekt kennen.
Man kann aber nicht das komplette Objekt durch ein neues ersetzen. (Man "kann" natürlich schon, aber alle anderen Stellen, die das Ursprungs Objekt kennen bekommen davon nichts mit).


Dieses Thema ist schon etwas komplex. Wenn ich also mit meiner Begriffswahl falsch liege, möge man mich bitte darauf hinweisen.

So ganz ist mir das nicht klar. Ich hab angenommen, dass jedes Object in Java ein Pointer ist.
Da ich in meinem Fall nur über Objects gehe, müsste ich doch bei Image schon auf die Adresse von TrainIRW zugreifen können.
 

X5-599

Top Contributor
Wie gesagt ich weiss nicht genau wie man die übergebenen "Objekte" jetzt bezeichnen soll. Pointer/Referenzen/Kopien von Referenzen... Keine Ahnung. Es ist aber wohl so, dass du die Original Objekte von jeden Ort aus verändern kannst; Du kannst aber nicht auf deren Bereich im Speicher ein neues erstellen.
Wenn dein übergebenes Image jetzt eine Methode hätte wie: "replaceImageDataWithDataFromNewImage(Image newImage)" dann würde ein Aufruf:
Code:
img.replaceImageDataWithDataFromNewImage(bi);
funktionieren.

Edit:
Wie gesagt, Ich kenne mich mit dem Speichermanagemant von Java nicht wirklich aus. Ich schreibe hier nur wie es sich für mich darstellt.
 
Zuletzt bearbeitet:

Joose

Top Contributor
Beispiel:

Java:
public class Person {
   public String name;

   public Person(String name) {
      this.name = name;
   }
}

......

public static void benennePersonUm(Person p) {
   p.name = "Gerhard";
}

public static void erzeugeNeuePerson(Person p) {
   p = new Person("Crite");
}

......

public static void main(String[] args) {
   Person p1 = new Person("Fritz");
   System.out.println(p1.name); // Fritz
   benennePersonUm(p1);
   System.out.println(p1.name); // Gerhard
   erzeugeNeuePerson(p1);
   System.out.println(p1.name); // Gerhard
}

Wir haben hier zwei Methoden "benennePersonUm" und "erzeugeNeuePerson", welche jeweils ein Objekt der Klasse Person erwarten.

In der lokalen Variable "p1" der main-Methode wird nur die Referenz auf das Objekt gespeichert.
Wenn man nun "p1" an eine Methode übergibst, wird eine Kopie dieser Referenz erzeugt.
In einer der beiden Methoden kannst man den "Inhalt" dieses Objektes ohne Probleme verändern (siehe Methode "benennePersonUm").
Aber man kannst nicht an der Speicherstelle (wo dein Referenz hinzeigt) ein komplett neues Objekt erstellen! (siehe Methode "erzeugeNeuePerson").

In der Methode "erzeugeNeuePerson" wird ein neues Objekt der Klasse Person erzeugt. Diese Objekt belegt im Speicher einen komplett neuen Bereich.
Regel: ein neues Objekt mit "new [Konstruktor](....)" erzeugen belegt immer neuen Speicherplatz!
Der Parameter der Methode "erzeugeNeuePerson" bekommt dabei die Referenz auf diese neues Objekt zugewiesen.

Die lokale Variable der main-Methode bleibt davon unbeeinträchtigt.

Ich hoffe dieses Beispiel inkl. Erklärung macht es etwas verständlicher.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K JavaFX Bildergalerie aus Image Ordner laden AWT, Swing, JavaFX & SWT 3
N Swing Image aus Web laden und in Icon umwandeln AWT, Swing, JavaFX & SWT 4
R Image laden sehr langsam AWT, Swing, JavaFX & SWT 7
G Image laden aber nicht in Applet Klasse AWT, Swing, JavaFX & SWT 2
S Problem beim Image laden AWT, Swing, JavaFX & SWT 4
T Image laden im Panel ? AWT, Swing, JavaFX & SWT 16
R Image in JPanel/JLabel laden? AWT, Swing, JavaFX & SWT 11
S Laden eines gif oder jpg in ein Image AWT, Swing, JavaFX & SWT 3
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
JMölleri Swing Image wird unscharf dargestellt AWT, Swing, JavaFX & SWT 2
L AWT .gif image transparent machen AWT, Swing, JavaFX & SWT 3
kodela angezeigtes Image entfernen AWT, Swing, JavaFX & SWT 1
R Java, GUI, Hintergrundbild, Image, AWT, Swing, JavaFX & SWT 4
R Swing Background Image in JFrame implementieren AWT, Swing, JavaFX & SWT 40
T Swing Buffered Image anzeigen AWT, Swing, JavaFX & SWT 45
L Image kann nicht gefunden werden AWT, Swing, JavaFX & SWT 1
S Stretch Image in ImageView AWT, Swing, JavaFX & SWT 4
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
L JavaFX Image mit Blureffect AWT, Swing, JavaFX & SWT 2
Bluedaishi JavaFX Button Image aus Datenbank AWT, Swing, JavaFX & SWT 13
F javaxt.io.Image getBufferedImage liefert null AWT, Swing, JavaFX & SWT 1
Yjuq JavaFX Custom Control - Image resize AWT, Swing, JavaFX & SWT 0
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
J 2D-Grafik Background Image Klasse AWT, Swing, JavaFX & SWT 14
Q AWT TicTacToe Image auf Button hinzufügen AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
L JavaFX leeres weißes Image - javafx.scene.image.Image AWT, Swing, JavaFX & SWT 2
L JavaFX Image im ImageView auf Scroll Listener reagieren AWT, Swing, JavaFX & SWT 5
Naxon89 JavaFX Image wird nicht korrekt geladen AWT, Swing, JavaFX & SWT 3
W Javafx - Image soll sich mit der Camera mitbewegen AWT, Swing, JavaFX & SWT 1
B Graphics to Image AWT, Swing, JavaFX & SWT 3
L Image in anderes kopieren AWT, Swing, JavaFX & SWT 0
T Swing Image wird nicht geladen AWT, Swing, JavaFX & SWT 1
S JavaFX Image Skalierung in Scrollpane, Scrollpane resized sich nicht AWT, Swing, JavaFX & SWT 5
I Image im PopupMenu vom SystemTray AWT, Swing, JavaFX & SWT 8
F JavaFX Position von Image angeben/verändern AWT, Swing, JavaFX & SWT 2
M JavaFX Image View Würfel berechnen AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
F Swing Image einem Button hinzufügen AWT, Swing, JavaFX & SWT 5
B Resize von Image nach Resize von Button AWT, Swing, JavaFX & SWT 1
T Image aus "nicht-src-ordner" AWT, Swing, JavaFX & SWT 5
vodkaz (javafx) Image Problem AWT, Swing, JavaFX & SWT 2
M Image in JTable einfügen AWT, Swing, JavaFX & SWT 9
M Image aus MS Access anzeigen lassen AWT, Swing, JavaFX & SWT 9
H Image im Array per Knopfdruck ändern AWT, Swing, JavaFX & SWT 6
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
G JavaFX Image vergrößern AWT, Swing, JavaFX & SWT 5
U Image mit Zeichenbereich rotieren AWT, Swing, JavaFX & SWT 3
P Speicherproblem SWT.Image in Nebula-Gallery AWT, Swing, JavaFX & SWT 3
L JavaFX: Bild in Image einlesen AWT, Swing, JavaFX & SWT 11
D Image soll langsam sichtbar werden AWT, Swing, JavaFX & SWT 4
D JLabel Image ausrichten AWT, Swing, JavaFX & SWT 2
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
H Image Icon ersetzen AWT, Swing, JavaFX & SWT 8
I Image Button AWT, Swing, JavaFX & SWT 4
U IntBuffer zum Image konvertieren. AWT, Swing, JavaFX & SWT 9
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
T 2D-Grafik Slideshow (DoubleBuffering und Image transformieren/bewegen) AWT, Swing, JavaFX & SWT 6
K Swing Warum bleibt das Image immer gleich AWT, Swing, JavaFX & SWT 4
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
D Image.getScaledInstance() vs. Netzwerkverbindung??? AWT, Swing, JavaFX & SWT 2
reibi SWT Image viewer AWT, Swing, JavaFX & SWT 2
lumo SWT Image funktion auf ImageDaten AWT, Swing, JavaFX & SWT 9
A Applet .gif in applet Image nicht animiert angezeigt AWT, Swing, JavaFX & SWT 4
M Image wird nicht neugezeichnet nach dem Wechsel AWT, Swing, JavaFX & SWT 2
lumo SWT Image Pattern AWT, Swing, JavaFX & SWT 5
P Image mehrfach in ein BufferedImage zeichnen AWT, Swing, JavaFX & SWT 7
M Swing Image in JPanel als Componente AWT, Swing, JavaFX & SWT 2
P nicht sichtbares JPanel / JFrame als Image speichern AWT, Swing, JavaFX & SWT 3
T Image skaliert in Variable speichern AWT, Swing, JavaFX & SWT 6
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
S Swing Image wird nicht geladen AWT, Swing, JavaFX & SWT 2
0 Mousecurser mit Image hinterlegen AWT, Swing, JavaFX & SWT 4
B Swing Drag&Drop mit Feedback (Image am Mauszeiger) AWT, Swing, JavaFX & SWT 7
N Java Choice Bilderausgabe - images - - image - AWT, Swing, JavaFX & SWT 2
D iText PdfPCell mit Image AWT, Swing, JavaFX & SWT 3
S 2D-Grafik Icon in Image (System Icons) AWT, Swing, JavaFX & SWT 2
S Button mit Image AWT, Swing, JavaFX & SWT 7
A Skaliertes Image pixelweise bearbeiten AWT, Swing, JavaFX & SWT 6
L Swing Image zur Laufzeit verändern AWT, Swing, JavaFX & SWT 6
F SWT GC drawText auf halbtransparentem Image AWT, Swing, JavaFX & SWT 21
G Swing JEdtitorPane und HTML Image Seite AWT, Swing, JavaFX & SWT 2
C Image mit Graphics2D zeichnen AWT, Swing, JavaFX & SWT 9
C Image performant skalieren AWT, Swing, JavaFX & SWT 5
D SWT Image Farbtiefe AWT, Swing, JavaFX & SWT 2
L Swing Auf unabhängiges Image-Objekt zeichnen AWT, Swing, JavaFX & SWT 8
lumo SWT Composite + Image + zeichnen AWT, Swing, JavaFX & SWT 4
V Ein Image als Button (nicht mit JButton(Icon)) AWT, Swing, JavaFX & SWT 5
D Image Viewer gesucht AWT, Swing, JavaFX & SWT 5
Kr0e Image schärfen AWT, Swing, JavaFX & SWT 2
R Bild drehen UND skalieren (Image bzw BufferedImage) AWT, Swing, JavaFX & SWT 5
T Image auf Image zeichnen AWT, Swing, JavaFX & SWT 2
E Warum ist offscreen (mit Image) schneller? AWT, Swing, JavaFX & SWT 11
G Swing Image speichern / 0 Byte AWT, Swing, JavaFX & SWT 7
H Image abspeichern AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben