Schwieriges Label - Font - Problem "Dynamisches Label&a

Status
Nicht offen für weitere Antworten.

mm105

Mitglied
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??
 
Einen ComponentListener auf das Label registrieren und in diesem dann die maximale font size errechnen anhand der String Bounds.
 
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 ???
 
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 🙂)))))
Code:
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....
 
in meinem Frust habe ich diese Lösung erstellt: FÜR ALLE DIE AUCH MAL DIESES PBL HABEN
Code:
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++;
	}
}
 
Hallo Matze,

hier ist mal meine Version...
Code:
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
 
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:
Code:
text.setFont(text.getFont().deriveFont((float)( source.getWidth() / 7)));
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben