Bild in JPanel

Status
Nicht offen für weitere Antworten.

hyperion

Bekanntes Mitglied
Hallo,

ich erstelle eine von mir erstelle Klasse, welche von JPanel abgeleitet ist. Das JPanel enthält ein JLabel, welches ein ImageIcon trägt. In meiner Klasse überschreibe ich die Methode paintComponent(Graphics g) um darauf zu zeichnen.

Das Zeichnen an sich funtkioniert auch, nur leider hinter dem Bild.

Hier ein simpler Code, welcher das wichtigste enthält:
Java:
public class ImageViewer
{   
   private JLabel bild;

  ImageViewer(String pfad, String titel)
  {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel panel = new MyDraw();
    ImageIcon icon = new ImageIcon(pfad);
    frame.setSize(icon.getIconWidth(), icon.getIconHeight());
    bild = new JLabel();
    bild.setIcon(icon);
    panel.add(bild);
    frame.getContentPane().add(panel);
    frame.setVisible(true); 
  }

class MyDraw extends JPanel
{       
    public void paintComponent(Graphics g)
    {
        g.drawString("dfasdfjasdfkljasdfkjasdfaksdjföaskdfasdf", 100, 100);
     }
}

Der String wird leider hinter das Bild gezeichnet. Durch googlen habe ich von dem Problem bereits gelesen. Allerdings funktioniert die ergooglete Lösung bei mir nicht ( this.paintChildrens(g)😉.

mfg hyperion
 
Zuletzt bearbeitet:
Das JPanel enthält ein JLabel, welches ein ImageIcon trägt.
Dann versuch's einfach umgekehrt: das JLabel mit dem Icon enthält das JPanel.
Die Kinder werden nämlich auf die Mutter oben drauf gemalt 😉
Java:
JPanel panel = new JPanel(){

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString("aha", 100, 100);
    }

};
panel.setOpaque(false);
bild.setLayout(new BorderLayout());
bild.add(panel);
 
Zuletzt bearbeitet:
Hallo,

ich habe leider noch eine Frage.
Mir wäre es lieber, wenn ich direkt auf das Bild zeichnen könnte, da ich im Moment das Problem habe, dass wenn ich die Größe des Fensters verändere das Bild gelich groß bleibt. Die Zeichnungen überdecken dann nicht mehr die gleichen Punkte des Bildes.

mfg hypeiron
 
Die Frage ist zwischen den Zeilen😉
Also ich würde gerne wissen, wie ich das Zeichnen auf dem JPanel durch das Zeichnen auf dem JLabel ersetzen könnte.

mfg hyperion
 
Hi,
willst du es umbedingt zeichnen, warum machst du das nicht über Image und ersparst dir dadurch die paintComponent nicht? Das Image addest du dem JLabel und das JLabel dem Panel 😉
MFG
 
schau dir das hier mal an
Java:
package Game;

import java.awt.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class ImageViewer
{   
	Image image;
	Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	
	public ImageViewer(String pfad, String titel)
	{
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		frame.setSize(d.width/2,d.height/2);
		frame.setLocation(d.width/4,d.height/4);
		frame.setLayout(new BorderLayout());
		
		JPanel panel = new MyDraw();
		frame.add(panel,"Center");
		
		frame.setVisible(true); 
	}
	public void load()
 	{
		try
		{
			image = ImageIO.read(new File("Bild.jpg"));
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
 	@SuppressWarnings("serial")
	class MyDraw extends JPanel
 	{       
 		public void paintComponent(Graphics g)
 		{
 			g.drawString("dfasdfjasdfkljasdfkjasdfaksdjföaskdfasdf", 100, 100);
 			g.drawImage(image,10,10,getSize().width-20,getSize().height-20,this);
g.setColor(Color.red);
g.fillOval(20,20,50,50);
 		}
 	}
 }
 
Zuletzt bearbeitet:
Hallo,

hmm also ich will nicht ein BIld zeichnen, sondern ein beretis existierendes BIld anzeigen und etwas über das Bild zeichnen. Also beispielsweise einen beswtimmten Bereich markieren(roter Kreis drumherum).
Bisher habe ich in einem JLabel das Bild und in einem JPanel Die Zeichnung. Ich würde jetzt gerne direkt auf das JLabel Zeichnen. Untere Ebene wäre dann das BIld und obere Ebene die Zeichnung.

Vielleicht habe ich jetzt auch deine Frage zur Frage falsch verstanden😉

mfg hyperion
 
Ohne paintComponent überschreiben, einfach den Text direkt aufs Bild schreiben und das Bild aufs Label adden

Java:
        img = ImageIO.read(new File("images/..."));	
        Graphics g = img.getGraphics();
//		g.setFont(new Font("SansSerif", Font.PLAIN, 12)); //<-- Nur als Beispiel
		g.setColor(Color.WHITE);
		g.drawString("Dies ist ein Text", 50, 50);
 
Zuletzt bearbeitet:
das geht net, es ist doch auch viel einfacher, wenn du das label überschreibst, dadrin das image zeichnest, und dann was schreibst, dann das label auf das Panel adden und fertig:
Java:
package Game;

import java.awt.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class ImageViewer
{   
	Image image;
	Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	
	@SuppressWarnings("serial")
	public ImageViewer(String pfad, String titel)
	{
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		frame.setSize(d.width/2,d.height/2);
		frame.setLocation(d.width/4,d.height/4);
		frame.setLayout(new BorderLayout());
		
		JPanel panel = new JPanel();
		panel.setLayout(new BorderLayout());
		frame.add(panel,"Center");
		
		JLabel label = new JLabel()
		{
			@Override
			public void paintComponent(Graphics g)
			{
	 			g.drawString("dfasdfjasdfkljasdfkjasdfaksdjföaskdfasdf", 100, 100);
	 			g.drawImage(image,10,10,getSize().width-20,getSize().height-20,this);

g.setColor(Color.red);
g.drawString("Hallo Springfield!",20,20);
			}
		};
		panel.add(label,"Center");
		
		frame.setVisible(true); 
	}
	public void load()
 	{
		try
		{
			image = ImageIO.read(new File("Bild.jpg"));
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
 }
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben