Image laden und auf jPanel ausgeben

leisure

Mitglied
Hallo,
ich habe (mit Netbeans) ein jFrame erzeugt und darauf u.a. ein jPanel abgelegt, auf dem jPanel sollen Bilder dargestellt werden.
Die Bilder sind als *.gif im selben Ordner wie der Quelltext des jFrame.

Der Code sieht vereinfacht so aus:

Java:
Graphics g=jPanel.getGraphics();
Image img=getToolkit.getImage("links.gif");
g.drawImage(img,20,20,jPanel);

Ich erhalte bei Ausführen des Programms keine Fehlermeldung, allerdings wird das Bild nicht auf dem Panel angezeigt.
 
Gezeichnet wird normal in der paintComponent (bzw. paint wenn man nicht Swing benutzt) Methode einer Komponente, da diese Methode beim Neuzeichnen aufgerufen wird, wohingegen die Methode mit getGraphics() nur eine temporäre Veränderung bewirkt. Dazu muss man eine Klasse von einer Komponente ableiten und diese Methode überschreiben.
Das sieht dann in etwa so aus:
Java:
class MyPanel extends JPanel{
	private Image bild;
		
	public MyPanel(){
		bild = Toolkit.getDefaultToolkit().getImage("Bild.jpg");
	}
		
	public void paintComponent(Graphics g){
		g.drawImage(bild, 0, 0, this);
	}
}

Von der Klasse fügst du dann eine Instanz in deinen JFrame.
Hier solltest du bei Gelegenheit mal reinschauen: Java ist auch eine Insel - Grafikprogrammierung
 
Zuletzt bearbeitet:
Wenn es NUR um das GANZ einfache Anzeigen des Bildes geht, könntest du auch ein ImageIcon nehmen. Bei allem, was darüber hinausgeht, solltest du sagen, was du vorhast.
 
Hallo Monaria und Marco13,

Danke für euere Beiträge. Mein Problem ist, dass ich mit Netbeans arbeite, also mein jPanel hübsch mit der Maus auf dem jFrame platziert habe.
Eine von jPanel abgeleitete Klasse müsste ich jetzt selbst "anmelden", positionieren etc. oder den Quelltext im geschützten Bereich des generierten Codes ändern. Beides kann ich bislang nicht.

Was ich mit dem Programm will? Es existiert eine Klasse "Musiker", die zwei Bilder besitzt (2 mals das gleiche Bild, aber gespiegelt). Die Musiker werden in einer Liste verwaltet und die Bilder auf dem jPanel angezeigt (so der Plan). Dann sollen damit verschiedene Listenoperationen demonstriert werden. Im Prinzip habe ich das Programm für eine an Schule angepasste Programmierumgebung schon geschrieben. Ich möchte mich aber davon lösen und diese Umgebung durch Netbeans ersetzen. Aber da habe ich noch einiges zu lernen.
 
Die Intention, die "an Schule angepasste Programmierumgebung" hinter sich zu lassen ist gut. Wirklich sinnvoll ist das aber IMHO nur dann, wenn man komplett auf irgendwelche GUI-Designer verzichtet, und alles von Hand schreibt. (Sonst kennt man sich am Ende auch nicht mit Swing aus, sondern nur mit dem GUI-Designer - und wenn es um mehr geht, als das Zusammenklicken eines Standard-Dialogs stößt man mit diesen Designern schnell an Grenzen. Der generierte Code ist i.a. schlecht wartbar und schlecht erweiterbar.).

Ich würde mal bei Trail: Creating a GUI With JFC/Swing (The Java™ Tutorials) reinschauen. Es spricht IMHO nichts dagegen, sich gleich am Anfang sowas wie Lesson: Using Swing Components (The Java™ Tutorials > Creating a GUI With JFC/Swing) bzw. How to Use Buttons, Check Boxes, and Radio Buttons (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components) anzusehen, und mal ein paar Beispiele von dort zu überfliegen. (Die Erklärungen zu den einzelnen Components sind sehr ausführlich, das braucht man für den Anfang nicht alles haarklein zu lesen...)
 
Hallo Marco13,

du hast zwar recht, aber es sind halt nur 2 Wochenstunden Informatik und Dank Zentralabitur ist der Stoffumfang nicht unerheblich. Da ist es schon sinnvoll, sich mit Netbeans die Kleinarbeit etwas vom Hals zu halten und sich dafür auf die Objektorientierung zu konzentrieren.
 
Darum Marcos erster Vorschlag:
Java:
ImageIcon icon=new ImageIcon(bild);
JLabel bildLabel=new JLabel(icon);
this.add(bildLabel);      //dieses this bezieht sich auf dein JPanel
 
Hallo Leute,

Danke für Eure Beiträge, die waren für mich sehr hilfreich, auch wenn mein Problem eigentlich gar nicht existierte. Da ich die Bildnamen ohne Pfadangabe angegeben hatte, suchte Netbeans im Projektordner und nicht im Sourcecode-Ordner, wo sie tatsächlich lagen. So funktioniert jetzt mein Code erst mal, aber natürlich muss dass mit repaint() oder paintCompomponent() noch irgendwie gelöst werden, damit nicht bei jeder Änderung des Frames die Bilder verwschwinden.
 

Zurück
Oben