Bilder der Label Größe anpassen

Nach etwas hin und her hab ich es mittlerweile verstanden wie ich mit dem MigLayout meine Lable wachsen und schrumpfen lasse. Jetzt würde ich aber gerne auch die Bilder auf den Labels mit wachsen und schrumpfen lassen beim reSize.

migPanel = new MigLayout("wrap, ins 0, gap 0","[grow]" ,"[grow 1][grow 1]");
panel.setLayout(migPanel);
lblImg.setIcon(new ImageIcon("img\\Big.png"));
panel.add(lblImg,"grow");

also so wie es imo ist ändert zwar das lbl seine Größe aber das Bild bleibt wie es ist. Gibt es hier eine “einfache” Möglichkeit das Bild mitwachsen zu lassen? Wie komme ich eigentlich an die Aktuelle Größe meiner Label? mit .getSize() oder .getBorder() toString bekomme ich immer nur 0 bei allen Werten angezeigt.

Dann solltest du dir eine Komponente schreiben, die die Bilder selbst zeichnet. Z.B. von JPanel oder JLabel erben und die paintComponent()-Methode mit dem Code zum Zeichnen des Bildes (skalieren) überschreiben.

BTW ist dein Code plattformabhängig (\) und kann nicht aus einer Jar-Datei heraus ausgeführt werden.
Zum Laden und Zeichenen von Bildern findest du im Wiki einen Artikel.

           lblImg=new GrafikLabel();


private class GrafikLabel extends JLabel {
		 
	      protected void paintComponent(Graphics g) {
	        Image image;
			try {
				image = ImageIO.read(new File("img/Big.png"));
				g.drawImage(image, 0, 0, this);
			} catch (IOException e) {
				e.printStackTrace();
			}
	            
	         
	      }
	   }

so? also bekomme auf jeden Fall das Bild so hingezeichnet. Allerdings nur in Originalgröße und ohne neu Skalierung beim größer ziehen… was fehlt mir noch ? ^^ Komme selber gerade nicht weiter :frowning:

Na, wie mir scheint, hast du das Tutorial zwar gefunden, aber nur zum Teil gelesen.
[ol]
[li]Der 1. Aufruf in der paintComponent()-Methode sollte super.paintComponent(g); sein[/li][li]Auf keinen Fall sollten Bilder in der paintComponent()-Methode geladen werden. Das ist ein Perfomance-Debakel! In der Methode wird nur gezeichnet, nichts geladen oder berechnet. Du solltest deine Bilder 1x entweder im Konstruktor oder einer geeigneten Methode laden.[/li][li]Bilder skaliert man mit Hilfe der Java-API so:[Image#getScaledInstance()](http://docs.oracle.com/javase/7/docs/api/java/awt/Image.html#getScaledInstance(int, int, int))[/li][li]Allerdings ist das nicht der sauberste Weg. Im Wiki gibt es einen passenden Artikel: Bilder skalieren[/li][/ol]

1.) Zeile 1 hatte ich rausgenommen um zu guckne was passiert.
2.) stimmt hab ich gelesen
3.) das ahtte ich schon versucht. So:

g.drawImage(image2, 0, 0, this);```

Ergebnis ist ein leerer Label ...

Kann ich hier nicht editieren?

 class GrafikLabel extends JLabel {
		 Image image2;
		 BufferedImage image;
		 
		 GrafikLabel(){
			 try {
				int width=80, height=120;
				image = ImageIO.read(new File("img/Big.png"));
				image2 = image.getScaledInstance(width,height, Image.SCALE_REPLICATE);
				BufferedImage outImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		        Graphics g = outImg.getGraphics();
		        g.drawImage(image2, 0, 0, null);
		        g.dispose(); 
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		 }
	      protected void paintComponent(Graphics g) {
	        super.paintComponent(g);
			g.drawImage(image2, 0, 0, this);
			g.dispose();
	            
	         
	      }
	   }

so läuft es erst mal aber mein Hauptproblem bleibt bestehen. Wie Skaliere ich beim Größe ändern des Frames mein Bild ? Ich würde ja gerne versuchen mit lbl.getSize() h und w meines Labels auslesen die Werte in height und width speichern … und dann hm erst mal dumm gucken aber versuchen einen ActionHandler für resize zu finden um da repiant(); reinschrieben aber soweit komme ich leider nicht, da ich schon am auslesen meiner Labelgröße scheitere.

Geht es idr. so wie ich es machen will? Wenn ja wie komme ich an meine Aktuellen Label werte?
Wenn nicht oder nicht gut gibt es eine bessere Lösung ?

Du brauchst kein JLabel, es reicht ein JPanel wenn du sowieso in paintComponent selbst zeichnest. Außerdem brauchst du das Bild nicht zu skalieren. Stattdessen soll es ja nur skaliert gezeichnet werden - und zwar genau so groß, wie die Component gerade ist.

class ImageComponent extends JPanel
{
    private Image image;
    public ImageComponent(Image image)
    {
        this.image = image;
    }
 
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        // Male das Bild so groß, wie diese Component gerade ist:
        g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
 
    }
}

Dort wird das Bild im Konstruktor übergeben, dh. du kannst das so erstellen:

Image image = ImageIO.read(new File("img/Big.png"));
JComponent imageComponent = new ImageComponent(image);

(Alternativ könnte man das Bild auch im Konstruktor laden, aber so kann man die ImageComponent für beliebige Bilder verwenden)

super danke. Genau das was ich gesucht habe :slight_smile:

Im Wiki habe ich noch Folgendes gefunden:
Bilder skalieren - Byte-Welt-Wiki - Java Beispielcode

Bei https://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html steht auch noch einiges dazu.