JLabel mit Icon & JFrame Resize

TiME-SPLiNTER

Aktives Mitglied
Hallo Zusammen,

Ich bin auf ein Problem gestossen, bei dem ich einfach nicht zu einem Ansatz komme. Ich habe ein JFrame mit einem BorderLayout. FIRST ist ein JPanel, dann CENTER ist mein JLabel (das Problemkind) und LAST ist wieder ein JPanel.

Im JLabel ist ein Icon das dem JFrame bei einem Resize (ComponentListener) von der Grösse her angeglichen wird. Das geht super solange das JLabel immer grösser und grösser wird. Wird es aber kleiner (das Fenster wird kleiner gezogen), dann bleibt das Icon auf der letzten Grösse da ich anhand der aktuellen Width und Height des JLabels die Grösse des Icons berechne.

Meine Frage ist jetzt, wie kann ich nun das Icon wieder verkleinern... oder was gäbe es für einen anderen Ansatz? Ich habe ein vereinfachtes Beispiel geschrieben was meine Problematik verdeutlichen soll.

Java:
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import ch.timesplinter.mediaguru.common.Utils;

public class TestJLabelIcon extends JFrame {
	private static final long serialVersionUID = -5427008595933142844L;
	private static final String PICTURE_PATH = "D:/bilder/beispiel.jpg";
	
	public TestJLabelIcon() {
		initComponents();
		initComponets2();
		
		initLoad();
	}
	
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
        );

        pack();
        
        setSize(800,600);
    }// </editor-fold>
	
    private void initComponets2() {
    	jLabel1.addComponentListener(new ComponentListener() {	
			@Override
			public void componentShown(ComponentEvent e) {
				initLoad();
			}
			
			@Override
			public void componentResized(ComponentEvent e) {
				initLoad();
			}
			
			@Override
			public void componentMoved(ComponentEvent e) {
				initLoad();
			}
			
			@Override
			public void componentHidden(ComponentEvent e) {
				initLoad();
			}
		});
    }
    
    private void initLoad() {
    	refreshJLabel();
    	jLabel1.setIcon(getResizedImage(new ImageIcon(PICTURE_PATH), jLabel1.getWidth(), jLabel1.getHeight()));
    }
    
    private void refreshJLabel() {
    	if(jLabel1 != null && jLabel1.getWidth() < this.getWidth() && jLabel1.getHeight() < this.getHeight())
    		return;
    	
    	System.out.println("NEU INIT");
    	
    }
    
	public static void main(String[] args) {
		TestJLabelIcon test = new TestJLabelIcon();
		test.setVisible(true);
	}

public static ImageIcon getResizedImage(ImageIcon imageIn, int maxWidth, int maxHeight) {
		if(imageIn == null)
			return imageIn;
		
		if(imageIn.getIconHeight() < maxHeight && imageIn.getIconWidth() < maxWidth)
			return imageIn;
		
		if(maxHeight <= 0 || maxWidth <= 0)
			return imageIn;
		
		CloneableImageIcon image = new CloneableImageIcon(imageIn.getImage());
		
		int newHeight;
		int newWidth;
		
		if((image.getIconHeight() > image.getIconWidth())) {
			newHeight = maxHeight;
			newWidth = (int)(image.getIconWidth()*((float)maxHeight/(float)image.getIconHeight()));
		} else if((image.getIconHeight() <= image.getIconWidth())) {
			newWidth = maxWidth;
			newHeight = (int)(image.getIconHeight()*((float)maxWidth/(float)image.getIconWidth()));
		
			if(newHeight > maxHeight) {
				newHeight = maxHeight;
				newWidth = (int)(image.getIconWidth()*((float)maxHeight/(float)image.getIconHeight()));
			}
		} else {
			return imageIn;
		}
		
		BufferedImage bImg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
		Graphics2D graphics2D = bImg.createGraphics();
        graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
          RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        graphics2D.drawImage(image.getImage(), 0, 0, newWidth, newHeight, null);
        
        image.setImage(bImg);
        
        return image;
	}
	
	private JLabel jLabel1;
}

CloneableImageIcon.java
Java:
import java.awt.Image;

import javax.swing.ImageIcon;

public class CloneableImageIcon extends ImageIcon implements Cloneable {
	private static final long serialVersionUID = 6320908079954312732L;

	public CloneableImageIcon(Image image) {
		super(image);
	}
	
	public CloneableImageIcon clone() {
		try {
			return (CloneableImageIcon)super.clone();
		} catch (CloneNotSupportedException e) {
		
		}
		
		return this;
	}
}
 

z-mon

Bekanntes Mitglied
Hallo TiME-SPLiNTER,

hier ein kleines Beispiel für ein ImageResize:

Java:
public class ImageResize extends JFrame{
	
	public ImageResize() {
		setTitle("Java Tutorial on www.itblogging.de");
		
		ImageContainer imageContainer = new ImageContainer("src/itblogging_half.png");
		add(imageContainer);

		setSize(234, 100);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		new ImageResize();
	}
	
	class ImageContainer extends JPanel
	{
	   private Image background;
	   
	   public ImageContainer(String imageSource)
	   {
		  Toolkit toolkit = getToolkit();
	      background = toolkit.createImage(imageSource);
	   }
	   
	   public void paintComponent(Graphics g)
	   {
	      int width = getWidth();
	      int height = getHeight();
	      g.drawImage(background, 0, 0, width, height, this);
	   }   
	}
}
 

L-ectron-X

Gesperrter Benutzer
Kleine Anmerkung: Toolkit ist schon ziemlich alt und ineffizient, was das Lesen von Bilddateien angeht. Nutze besser
Code:
javax.imageio.ImageIO
und deren Methoden zum Lesen von Bilddateien. ImageIO ist wesentlich effizienter und geradliniger in der Anwendung als Toolkit.
 

TiME-SPLiNTER

Aktives Mitglied
Vielen Dank an z-mon :D. Mit der richtigen paintComponent-Methode klappt das nun wunderbar und einfacher als zuvor. (Ich hatte ein Fehler in der Resize-Logik.)

Java:
public void paintComponent(Graphics g) {
          int panelWidth = getWidth();
          int panelHeight = getHeight();   
          int imageWidth = currentImage.getWidth(null);
          int imageHeight = currentImage.getHeight(null);
          
          int newWidth = imageWidth;
          int newHeight = imageHeight;
          
          if(imageWidth > panelWidth || imageHeight > panelHeight) {
	    	  if(imageHeight > panelHeight) {
	    		  newHeight = panelHeight;
	        	  newWidth = (int)(imageWidth*((float)panelHeight/(float)imageHeight)); 
	    	  } else {
	    		  newWidth = panelWidth;
	        	  newHeight = (int)(imageHeight*((float)panelWidth/(float)imageWidth));
	    	  }
	    	  
	    	  if(newHeight > panelHeight) {
	    		  newHeight = panelHeight;
	        	  newWidth = (int)(imageWidth*((float)panelHeight/(float)imageHeight)); 
	    	  }
	    	  
	    	  if(newWidth > panelWidth) {
	    		  newWidth = panelWidth;
	        	  newHeight = (int)(imageHeight*((float)panelWidth/(float)imageWidth));
	    	  }
          }
          
          g.drawImage(currentImage, 0, 0, newWidth, newHeight, this);
       }

Und danke an L-ectron-X für die Info "Toolkit vs. ImageIO" :).
 

L-ectron-X

Gesperrter Benutzer
Und weil ich es gerade sehe:
Die erste Zeile in der paintComponent()-Methode sollte immer
Java:
super.paintComponent(g);
sein. Das verhindert, dass es zu unerwünschten Effekten beim Zeichnen kommt.
 

z-mon

Bekanntes Mitglied
Kleine Anmerkung: Toolkit ist schon ziemlich alt und ineffizient, was das Lesen von Bilddateien angeht. Nutze besser
Code:
javax.imageio.ImageIO
und deren Methoden zum Lesen von Bilddateien. ImageIO ist wesentlich effizienter und geradliniger in der Anwendung als Toolkit.

Diese Info war mir auch noch nicht bekannt. Ist auch schon ein wenig her das ich eine GUI entwickelt habe. Aber wie das halt immer so ist in der Informatik: Man lernt nie aus :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JLabel Icon Pfeilform AWT, Swing, JavaFX & SWT 14
badfish Swing ImageIcon auf JLabel, Fenster Maximieren verbieten und Icon oben links austauschen? AWT, Swing, JavaFX & SWT 5
V Bei JLabel das Icon Über den Text machen AWT, Swing, JavaFX & SWT 2
$ Layoutabhängige größe von JLabel für Icon abfragen AWT, Swing, JavaFX & SWT 2
R JLabel Icon wieder entfernen AWT, Swing, JavaFX & SWT 4
D Frage zu Icon vom JLabel... AWT, Swing, JavaFX & SWT 2
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
C Swing Übergabe von String an JLabel AWT, Swing, JavaFX & SWT 9
H Swing Anpassen der Textgröße im JLabel funktioniert nur bedingt AWT, Swing, JavaFX & SWT 7
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
D JLabel übereinanderlegen AWT, Swing, JavaFX & SWT 5
E JLabel kopieren AWT, Swing, JavaFX & SWT 31
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
J Swing JLabel Verknüpfung aktualisieren AWT, Swing, JavaFX & SWT 3
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
F JLabel mit ImageIcon per Button bewegen AWT, Swing, JavaFX & SWT 4
H String teilen, damit bei JLabel keine Punkte am Ende angezeigt werden AWT, Swing, JavaFX & SWT 4
S Swing JLabel Text mit der Zeit ändern AWT, Swing, JavaFX & SWT 1
E JLabel AWT, Swing, JavaFX & SWT 1
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
I JLabel neue Zeile AWT, Swing, JavaFX & SWT 4
L JLabel ist verzerrt/größer als eingestellt AWT, Swing, JavaFX & SWT 15
B Observer Pattern JLabel ändern AWT, Swing, JavaFX & SWT 7
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
E Wie kann ich ein JLabel auf größe der schriftlänge setzten? AWT, Swing, JavaFX & SWT 2
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
L Kalendar als JLabel einfügen AWT, Swing, JavaFX & SWT 3
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
it_is_all jLabel.setText -> Char in Str: NullpointerException AWT, Swing, JavaFX & SWT 1
4 Swing JLabel wird ,,abgehackt" AWT, Swing, JavaFX & SWT 3
it_is_all JLabel.setIcon - funktioniert nicht mehr AWT, Swing, JavaFX & SWT 2
P Aktualisierung von jLabel in jFrames AWT, Swing, JavaFX & SWT 8
DaCrazyJavaExpert Swing JLabel Klickanimation AWT, Swing, JavaFX & SWT 4
A Swing JLabel als Parameter übergeben AWT, Swing, JavaFX & SWT 9
M JLabel ausrichten AWT, Swing, JavaFX & SWT 2
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
T JLabel Textinhalt von Oben anzeigen AWT, Swing, JavaFX & SWT 1
N JLabel in JTabbedPane verschieben AWT, Swing, JavaFX & SWT 2
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
R Swing JLabel berührung an einem anderen Label prüfen AWT, Swing, JavaFX & SWT 3
Thallius Swing "..." beim JLabel verhindern? AWT, Swing, JavaFX & SWT 3
OlafHD JLabel im JFrame Zentrieren AWT, Swing, JavaFX & SWT 2
T Event Handling JLabel als eigener Button AWT, Swing, JavaFX & SWT 7
T JLabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
F Abgeleitetes JLabel AWT, Swing, JavaFX & SWT 16
D Swing keine JLabel-Aktualisierung bei "externem" Aufruf durch Helferklasse AWT, Swing, JavaFX & SWT 10
S jLabel HTML Formatierung AWT, Swing, JavaFX & SWT 2
J Statisches JLabel adden AWT, Swing, JavaFX & SWT 4
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
T JLabel in die Mitte(JLabel.CENTER geht nicht) AWT, Swing, JavaFX & SWT 12
2 JLabel - setText ändert den Text nicht AWT, Swing, JavaFX & SWT 4
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta JLabel anzuzeigenden Text zentrieren AWT, Swing, JavaFX & SWT 9
K Swing unterschied JTextField und JLabel AWT, Swing, JavaFX & SWT 7
F Swing JLabel in JFrame anpassen AWT, Swing, JavaFX & SWT 20
E JLabel aus Runnable ändern AWT, Swing, JavaFX & SWT 2
Z AWT JLabel setzt kein neuen Text AWT, Swing, JavaFX & SWT 6
D JLabel bei Aufruf neue Zeile AWT, Swing, JavaFX & SWT 5
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
F ListCellRenderer mit JLabel und MouseListener AWT, Swing, JavaFX & SWT 4
F Swing JLabel wird nicht sofort Angezeigt AWT, Swing, JavaFX & SWT 3
D Timer für Bildfolge in einem jLabel AWT, Swing, JavaFX & SWT 5
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
GreyFox JLabel in laufender Anwendung erzeugen AWT, Swing, JavaFX & SWT 6
H Position eines JLabel in einem JPanel AWT, Swing, JavaFX & SWT 2
Z Auf ein JLabel drauf malen? AWT, Swing, JavaFX & SWT 1
S JLabel in den Vordergrund rücken AWT, Swing, JavaFX & SWT 1
A JLabel hochzählen lassen. AWT, Swing, JavaFX & SWT 6
S JLabel mit ImageIcon, komischer Rahmen? AWT, Swing, JavaFX & SWT 2
I Swing JLabel Bild für 1sec anzeigen lassen AWT, Swing, JavaFX & SWT 13
S JLabel anordnen AWT, Swing, JavaFX & SWT 2
J ungewollt-automatische Größenänderung von JLabel AWT, Swing, JavaFX & SWT 5
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
L 2D-Grafik PNG Datei in JLabel Array Problem AWT, Swing, JavaFX & SWT 4
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
B Swing JLabel und LayoutManager AWT, Swing, JavaFX & SWT 20
M Bild aus JLabel resizen und speichern AWT, Swing, JavaFX & SWT 0
A Swing JLabel/JTextField Inhalt mit JSlider verändern AWT, Swing, JavaFX & SWT 12
O Statusleiste mit JLabel aktualisieren AWT, Swing, JavaFX & SWT 5
G jLabel aus anderem Fenster ändern AWT, Swing, JavaFX & SWT 7
T JLabel Nullpunkt verschieben AWT, Swing, JavaFX & SWT 6
F Swing JPanel mit JLabel spinnt? AWT, Swing, JavaFX & SWT 2
M Massenweise JLabel ? oder ? AWT, Swing, JavaFX & SWT 3
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
R AWT JLabel oder JButton aktualisieren AWT, Swing, JavaFX & SWT 1
N JLabel HTML mit custom Font AWT, Swing, JavaFX & SWT 0
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
G JLabel verdeckt AWT, Swing, JavaFX & SWT 12
A JLabel zeichendicke einstellen AWT, Swing, JavaFX & SWT 3
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
S JLabel zeigt ImageIcon nicht AWT, Swing, JavaFX & SWT 13
S jLabel / jText beim starten ausblenden AWT, Swing, JavaFX & SWT 2
A Array von JLabel mit Grafiken anzeigen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben