Problem bei IconImage darstellen

Hallo Leute,

ich versuche Swings zu lernen und bin ich auf Probleme gestoßen

import java.awt.Frame;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class MyFrame extends JFrame{
	
	public static void main(String[] args) {
		new MyFrame();
	}
	
	public MyFrame(){
		setSize(400,300);
		setLocation(200, 200);
		setTitle("Hallo Welt");
		setVisible(true);
		
		Image image = Toolkit.getDefaultToolkit().getImage("hund.jpg");
		
		setIconImage(image);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}

}

Ich habe zwar diese Fehlermeldung gegoogelt aber bin ich nicht schlauer geworden :frowning:

admins-macbook.localdomain java[429] : CGContextGetCTM: invalid context 0x0
admins-macbook.localdomain java[429] : CGContextSetBaseCTM: invalid context 0x0
admins-macbook.localdomain java[429] : CGContextGetCTM: invalid context 0x0
admins-macbook.localdomain java[429] : CGContextSetBaseCTM: invalid context 0x0

danke euch Anni

Hast du mal versucht, die Grafikdatei mit ImageIO zu laden?

danke für den tollen Link
ich habe versucht mit ```Image image = ImageIO.read(getClass().getResource(“java.gif”));

		setIconImage(image);
	```

und ist gleiche Fehlermeldung gekommen

und wenn ich damit lade
Image image = ImageIO.read(new File("java.gif"));

wird geschrieben, dass Input file nicht gelesen wird

java.gif ist irgendwo als resource in deinem Projekt verfuegbar ? Wie und wo liegt es im verhaeltnis zu deinem Projekt?

setVisible(true);erst zum Schluss?

ja das bild ist in dem Projekt verfügbar und setVisible habe ich auch am schluss gemacht und hat sich nichts verändert

Ich hab das in meiner Anwendung so drin:

// Icon für Anwendung
URL url = getClass().getResource("/resources/images/app_logo_16x16.png");
mainFrame.setIconImage (Toolkit.getDefaultToolkit().getImage(url));

Also, das Bild in einem Source Folder drin und dann so eingebunden. Funktioniert bei mir jedenfalls…

Eigentlich sollte es ja eher BufferedImage img = ImageIO.read(…); sein, oder?

Ein [japi]BufferedImage[/japi] ist auch ein [japi]Image[/japi]. Du kannst also nach dem Lesen auch direkt mit Image weiterarbeiten.

von meine Fehlermeldung könnt ihr sicher mehr anfangen


public class MyFrame extends JFrame{
	
	public static void main(String[] args) throws IOException  {
		new MyFrame();
	}
	
	public MyFrame() throws IOException  {
		setPreferredSize(new Dimension(400, 200));
		setLocation(200, 200);
		setTitle("Hallo Welt");
		

		//Image image = Toolkit.getDefaultToolkit().getImage("java.gif");
		
		
		Image image = ImageIO.read(new File("java.gif"));
		setIconImage(image);
		
		setState(JFrame.NORMAL);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setVisible(true);
		
	}


}

Exception in thread „main“ javax.imageio.IIOException: Can’t read input file!
at javax.imageio.ImageIO.read(ImageIO.java:1275)
at swingtutorial.MyFrame.(MyFrame.java:32)
at swingtutorial.MyFrame.main(MyFrame.java:20)

danke euch

Diese Fehlermeldung wird geworfen, wenn ImageIO die angegebene Datei nicht lesen kann. Sehr wahrscheinlich gibt es im Verzeichnis, in dem auch deine Klasse MyFrame.class gespeichert ist, keine Datei namens java.gif.
Wo genau liegt denn deine Grafikdatei und wo deine Klasse?

*** Edit ***

Wenn die Grafik Teil des Programms sein/werden soll, empfiehlt es sich, diese in ein Verzeichnis unterhalb deiner Klasse zu speichern und alles komplett in einer Jar-Datei zu speichern.
Dann kannst du mit getClass().getResource(…) arbeiten. Siehe Link oben.

ist das nicht in richtigem Verzeichnis?

Es muss im Verzeichnis der Class-Datei liegen. :wink: Nur diese wird doch ausgeführt.

Hier mal ein angepasstes, per Doppelklick ausführbares Komplettbeispiel:
(Quellcode liegt in der Jar-Datei)

danke für eure hilfe und geduld. Extrem nett von L-ectron-X und euch allen. Blöderweise mache ich fortschritte sehr langsam :frowning: . ich dachte wenn das bild und code in gleichem Verzeichnis ist, braucht man keine pfadangabe

Es geht nur darum, wo sich das Bild zur Laufzeit des Programmes befindet. Es muss für die Class-Datei, also dein eigentlich ausgeführter Code, zu finden sein.
Das Bild muss also in deinem Fall zur Laufzeit im Verzeichnis deiner Class-Datei liegen. Was im Verzeichnis deiner Quellcode-Datei an Grafikdateien liegt, ist erstmal zweitrangig.

Sieh also mal nach, was im Verzeichnis deiner Class-Datei liegt. Kein Bild? Dann kopiere es mal dort hinein und starte dein Programm.

Aber wie schon oben gesagt: die File-Objekt-Lösung ist für diesen Fall nicht unbedingt geeignet.

DAS ist mir klar - aber ist ein buffered image nicht generell besser als einfach nur ein image? , das meinte ich :slight_smile:

Ist in dem Fall total egal… mann ninmt immer das kleinste in der hierarchie was geht

Sent from my LT22i using Tapatalk now Free