JPanel zeigt Bild nicht an

Eklaf

Mitglied
Hallo alle zusammen ich habe da ein Problem ist warscheinlich banal aber ich blicks gerade nicht mehr:eek:

Das ganze Programm wäre zuviel drum hier die wichtigsten Teile

In diesem Panel soll das Bild und ein Koordinatenkreuz gezeichnet werden

Code:
				pnlBildKoordinate =new JPanel();
				pnlBildKoordinate.add(grafikKoor);
				mainFrame.getContentPane().add(BorderLayout.CENTER,pnlBildKoordinate);
			
			mainFrame.setSize(500, 500);
			mainFrame.setVisible(true);

die grafikKoor beinhaltet den folgenden Code

Code:
package Hilfsklassen;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class grafikKoordinate extends JPanel
{
	
	Werte classWerte;
	
	public grafikKoordinate(Werte p_classWerte)
	{
		this.classWerte=p_classWerte;
		this.setPreferredSize(new Dimension(400,400));
	}
	
	public void paintComponent (Graphics g)
	{
		super.paintComponent(g);
		
		g.setColor(Color.MAGENTA);
		g.drawLine(classWerte.get_iGrafikX(), 0, classWerte.get_iGrafikX(), 400);
		g.drawLine(0, classWerte.get_iGrafikY(), 400, classWerte.get_iGrafikY());
		g.drawOval(classWerte.get_iGrafikX()-20, classWerte.get_iGrafikY()-20, 40, 40);
		g.drawString("x: "+classWerte.get_iXPos(), classWerte.get_iGrafikX()+20, classWerte.get_iGrafikY()-40);
		g.drawString("y: "+classWerte.get_iYPos(), classWerte.get_iGrafikX()+20, classWerte.get_iGrafikY()-20);
		g.drawImage(new ImageIcon("Copy of AstronomieSoftware/src/Hilfsklassen/sterne_klein_gif.gif").getImage(),0,0,null);
		
	}
}

die Striche und den Kreis zeigt es an das Bild allerdings nicht hab schon einiges versucht wie zb mit Jpg und Gif bildern mit null und this als letzten Übergabewert mit superpaint drin und drausen hat aber alles nichts gebracht hoffe mir kann hier jemand weiterhelfen
 
Also erstens solltest du ERST das Bild zeichnen und DANN das Koordinatensystem ... ansonsten wird das nämlich vom Bild übermalt.
Zweitens : erstelle doch erstmal das ImageIcon ... und dann zieh das Image raus ... und prüf dann erstmal ob das nicht zufällig NULL ist ...
Einfacher geht es ein File-Objekt zu nehmen ... mit exists() prüfen ob es existiert ... und dann mit toURI().toURL() ne URL draus machen und diesen dann ImageIcon übergeben.
Weil ich würde jetzt mal drauf wetten das das File was du glaubst zu lesen garnicht existiert.
 
Hab das wie folgt gemacht

Code:
public void paintComponent (Graphics g)
	{
		super.paintComponent(g);
		
		if (imageIcon==null)
			System.out.println("Bild ist nicht da");
		else 
			System.out.println("Bild is da");
		
		g.drawImage(imageIcon.getImage(),0,0,null);
		g.setColor(Color.MAGENTA);
		g.drawLine(classWerte.get_iGrafikX(), 0, classWerte.get_iGrafikX(), 400);
		g.drawLine(0, classWerte.get_iGrafikY(), 400, classWerte.get_iGrafikY());
		g.drawOval(classWerte.get_iGrafikX()-20, classWerte.get_iGrafikY()-20, 40, 40);
		g.drawString("x: "+classWerte.get_iXPos(), classWerte.get_iGrafikX()+20, classWerte.get_iGrafikY()-40);
		g.drawString("y: "+classWerte.get_iYPos(), classWerte.get_iGrafikX()+20, classWerte.get_iGrafikY()-20);

und er sagt mir "Bild ist da" das is es schon mal nicht und drawImage ist jetzt auch oben das ist es auch nicht
 
Öhm... Es liegt wohl eher daran, dass das Bild noch nicht geladen ist, aber schon gezeichnet werden soll. Dafür gibt es die Klasse MediaTracker, mit der man dafür sorgen kann, dass nix passiert bis alle Bilder geladen wurden.
 
Es ist sowieso schlecht das Bild erst in der paintComponent()-Methode zu erzeugen / laden.
Du solltest dies so früh wie möglich tun. Also schon in main oder einer extra Methode.
Das mit dem MediaTracker habe ich bei vielen hier schon gesehen ... kenne mich selbst damit aber leider nicht aus.
Und das imageIcon nicht NULL ist ist klar weil du es ja irgendwo mit new ImageIcon() erzeugt hast ... was wichtig ist ob der Inhalt NULL ist ... daher das mit File und URL und so ...

Außerdem macht mich die Ordnerbezeichnung "Copy of " sorgen das du mit einer alten Kopie des Ordners arbeitest aber alle änderungen im Original machst ... also greife mal ABSOLUT auf das Bild zu ... es kann sein das der Pfad falsch ist.
 
Lade jetzt im Konstruktor das bild und habe auch einen Mediatracker eingefügt geht aber noch immer nicht

Hier die Graphiks Methode:
Code:
package Hilfsklassen;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class grafikKoordinate extends JPanel
{
	private static final long serialVersionUID = 1L;
	Werte classWerte;	
	ImageIcon imageIc;
	Image img;
	MediaTracker mediaTracker;
	
	
	public grafikKoordinate(Werte p_classWerte)
	{
		this.classWerte=p_classWerte;
		this.setPreferredSize(new Dimension(400,400));
	//	imageIc =new ImageIcon("Copy of AstronomieSoftware/src/Hilfsklassen/sterne_klein_gif.gif");
		img = getToolkit().getImage("Copy of AstronomieSoftware/src/Hilfsklassen/sterne_klein.jpg");
		mediaTracker =new MediaTracker(this);
		mediaTracker.addImage(img, 1);
		try 
		{
			mediaTracker.waitForAll();
		} catch (InterruptedException e) 
		{			
			e.printStackTrace();
		}
	}
	
	public void paintComponent (Graphics g)
	{
		super.paintComponent(g);
		
		//if (mediaTracker.checkID(1) == true)	
			g.drawImage(img,0,0,this);
		
		g.setColor(Color.MAGENTA);
		g.drawLine(classWerte.get_iGrafikX(), 0, classWerte.get_iGrafikX(), 400);
		g.drawLine(0, classWerte.get_iGrafikY(), 400, classWerte.get_iGrafikY());
		g.drawOval(classWerte.get_iGrafikX()-20, classWerte.get_iGrafikY()-20, 40, 40);
		g.drawString("x: "+classWerte.get_iXPos(), classWerte.get_iGrafikX()+20, classWerte.get_iGrafikY()-40);
		g.drawString("y: "+classWerte.get_iYPos(), classWerte.get_iGrafikX()+20, classWerte.get_iGrafikY()-20);	
	}
}

Beim PanelCode hat sich nichts geändert:
Code:
pnlBildKoordinate =new JPanel();
				pnlBildKoordinate.add(grafikKoor);
				pnlBildKoordinate.setVisible(true);
				mainFrame.getContentPane().add(BorderLayout.CENTER,pnlBildKoordinate);
			
			mainFrame.setSize(500, 500);
			mainFrame.setVisible(true);
 
Warum machst du es denn nicht mal so wie ich es dir Vorgeschlagen habe ?
Ein File-Objekt erzeugen .. mit if(file.exists()) prüfen ob es das File überhaupt gibt ... dann mit .toURI().toURL() die URL rausziehen und diese ImageIcon als parameter übergeben.
Mehr sag ich dazu jetzt erstmal nicht da ich MediaTracker wie gesagt noch nie verwendet habe.
Wenn das immer nocht nicht funktioniert dann versuch mal die andere drawImage()-Methode
Java:
Graphics.drawImage(Image, x, y, width, height, null);
 
Danke für deine Anregung nachdem ich mal High und Width des Img geprüft habe und -1 raus bekom war mir klar das es das Bild nicht lädt nach ein paar rechergen und versuchen habe ich herausgefunden das mein Pfad zu lang ist

Code:
Hilfsklassen/sterne_klein.jpg

hatt ausgereicht und dann hat alles geklappt danke an alle ihr seit spitze :D
 
Tja ... wenn du es mal mit nem File-Objekt geprüft hättest wäre dir das vorher aufgefallen. Aber du wolltest ja nicht auf mich hören.
 
Zurück