Swing Besserer Weg mit FontMetrics

realodds

Aktives Mitglied
Hallo, ich brauche je nach String und der bestimmten Width von einem Rechteck ein bestimmtes Font. Ich habe vollgendes "Verfahren gemacht", das ist allerdings sehr unschön gemacht von mir. Mir fällt trotzdem keine andere Möglichkeit ein.
Java:
import java.awt.Component;
import java.awt.Container;
import java.awt.Font;

public class FontGenerator {

    public static void main(String[] args) {
        FontGenerator fg = new FontGenerator();
        System.out.println(fg.getEffectFont(400, 30, 25).getSize());
    }

    public String getEffect() {
        return "Generates a Font for a certain String";
    }

    private Font effectFont;

    public Font getEffectFont(int width, int rand, int toleranz) {
        if (effectFont == null)
            effectFont = loadEffectFont(width, getEffect(), rand, toleranz);
        return effectFont;
    }

    private Font loadEffectFont(final int width, final String str, final int rand, final int toleranz) {
        final Component c = new Container();
        Font font = new Font("serif", Font.BOLD, 20);
        int length = 0;
        for (int i = 20; i < 80; i++) {
            font = new Font("serif", Font.BOLD, i);
            length = c.getFontMetrics(font).stringWidth(str);
            if ((width - rand * 2) - length <= toleranz && (width - rand * 2) - length > 0)
                break;
        }
        return font;
    }
}
Danke im Voraus.
Edit: Prefix müsste awt sein 😅
 

mihe7

Top Contributor
Wenn ich Dich richtig verstehe, willst Du die Schriftgröße ermitteln, so dass ein gegebener Text eine gegebene Breite hat. Das würde ich über einen klassischen Dreisatz versuchen, unter der Annahme, dass die Schriftbreite sich proportional zur Schriftgröße verhält. Also etwas wie Schriftbreite_12pt verhält sich zu Schriftgröße_12pt wie sich gewünschte Schriftbreite zur gesuchen Schriftgröße verhält. Damit ist die gesuchte Schriftgröße = gewünschte Schriftbreite * Schriftgröße_12pt / Schriftbreite_12pt.
 

Ähnliche Java Themen


Oben