# Schwieriges Label - Font - Problem "Dynamisches Label&a



## mm105 (15. Sep 2006)

Hallo, 

rätsel schon seit einiger Zeit rum und finde keine Lösung:

habe ein Label per Layout-Manager platziert, welches bei Größenänderung des Fensters ebenfalls seine Größe ändert. Allerdings interessiert dies meinen Text im Label nicht. Dieser hält sich fleißig an seine Font-Size.

Ziel ist ein Label mit stets maximierten Text im Label, egal wie groß der Text und das Label.

Hat jemand eine Idee??


----------



## Mac Systems (15. Sep 2006)

Einen ComponentListener auf das Label registrieren und in diesem dann die maximale font size errechnen anhand der String Bounds.


----------



## mm105 (15. Sep 2006)

Mac Systems hat gesagt.:
			
		

> Einen ComponentListener auf das Label registrieren und in diesem dann die maximale font size errechnen anhand der String Bounds.



hmm...
- ComponentListener ist klar
- aber wie bekomme ich die Weite des Textes (finde patu keine Methode)

Müsste dann wohl ne Schleif programmieren die solange den Font vergrößert, bis die Text- Höhe oder -Weite größer als die des Labels ist ???


----------



## mm105 (15. Sep 2006)

HAT DENN KEINER EINE IDEE?

Diese Problem kann doch nicht nur ich haben. Da muss es doch Methoden geben....

Mein derzeitiger Workaround klappt leider nicht )))))

```
private void resizeFont(JLabel label){
	int maxHeight	= label.getHeight();
	int maxWidth	= label.getWidth();
	int fontHeight	= label.getFontMetrics(label.getFont()).getHeight();
	int fontWidth	= label.getFontMetrics(label.getFont()).stringWidth(label.getText());
	int size = 1;
	System.out.println(" maxHeight="+maxHeight+" maxWidth="+maxWidth+" fontHeight="+fontHeight+" fontWidth="+fontWidth);
	while (fontHeight < maxHeight && fontWidth < maxWidth){
		label.setFont(label.getFont().deriveFont(size));
		fontHeight	= label.getFontMetrics(label.getFont()).getHeight();
		fontWidth	= label.getFontMetrics(label.getFont()).stringWidth(label.getText());
		size++;
	}
}
```

Läuft leider in eine Endlosschleife....


----------



## mm105 (15. Sep 2006)

in meinem Frust habe ich diese Lösung erstellt: FÜR ALLE DIE AUCH MAL DIESES PBL HABEN

```
private void resizeFont(JLabel label){
	int maxHeight	= label.getHeight()-10;
	int maxWidth	= label.getWidth()-10;
	int fontHeight	= 1;
	int fontWidth	= 1;
	int size 		= 1;
	while (fontHeight < maxHeight && fontWidth < maxWidth && size < 300){
		label.setFont(label.getFont().deriveFont((float) size));
		fontHeight	= label.getFontMetrics(label.getFont()).getHeight();
		fontWidth	= label.getFontMetrics(label.getFont()).stringWidth(label.getText());
		size++;
	}
}
```


----------



## Guest (16. Sep 2006)

Hallo Matze,

hier ist mal meine Version...

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PanelTest extends JFrame implements ComponentListener {
	
	JPanel panel;
	JLabel text;
	
	public PanelTest() {
		super("TestPanel");
		
//		this.setLayout();
		text = new JLabel("Nur ein Test!");
		getContentPane().add(text, "Center");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.addComponentListener(this);
		this.setLocation(200, 200);
		this.setSize(400, 200);
		this.setVisible(true);
		
	}
	
	private Font update(int width, int height) {
		Font testFont = null;
		int size = 0;
		for (int i = 1; i<height; i++) {
			testFont = new Font("Dialog", Font.BOLD, i);
			text.setFont(testFont);
			if (text.getFontMetrics(testFont).stringWidth("Nur ein Test!")>width) break;
			if (text.getFontMetrics(testFont).getHeight()>height) break;
			size = (i-2);  // vermutlich nötig, da ich die Insets nicht beachte
		}
		return new Font("Dialog", Font.BOLD, size);
	}
	
	public void componentResized(ComponentEvent cEvent) {
		JFrame source = (JFrame)cEvent.getSource();
		System.out.print("Width: "+source.getWidth());
		System.out.println("\tHeight: "+source.getHeight());
		System.out.print("Labelwidth: "+text.getWidth());
		System.out.println("\tLabelheight: "+text.getHeight());
		System.out.println("Font: "+text.getFont().toString());
		text.setFont(update(source.getWidth(), source.getHeight()));
		
	}
	
	public void componentShown(ComponentEvent cEvent) { }
	
	public void componentMoved(ComponentEvent cEvent) {}
	
	public void componentHidden(ComponentEvent cEvent) {}
	
	public static void main(String[] args) {
		new PanelTest();
	}

}
```

Viel Spass noch!!!

MfG

Sneaker


----------



## André Uhres (17. Sep 2006)

Ich nehme mal an, daß der Text im Label immer gleich ist.
Dann ist das Verhältnis der Labelbreite zur Schriftgrösse auch immer gleich:

```
text.setFont(text.getFont().deriveFont((float)( source.getWidth() / 7)));
```


----------



## mm105 (17. Sep 2006)

André Uhres hat gesagt.:
			
		

> Ich nehme mal an, daß der Text im Label immer gleich ist.



Leider nicht immer, aber für die statischen Texte auch eine gute Idee. Vielen Dank.

An Sneaker: thx ))


----------

