2011-01-11 12 views
4

ich versuche, eine große "Hallo Welt" auf meinem Rahmen/Komponente zu malen. Aber ich möchte es dynamisch an die Fenstergröße anpassen. Jedes Mal, wenn ich die Größe des Fensters ändere, sollte der Text perfekt in das Fenster passen.Java: Wie man bemalten Text dynamisch in Fenster einfügt

Ich benutze die FontMetrics-Klasse, der ich eine Schriftart zuweisen und die Breite und Höhe eines Zeichens messen.

Aber es wäre gut, eine Methode zu haben, die ich die Größe einer Komponente mit einem Text übergebe und die Methode gibt eine Schriftart zurück, die ich verwenden muss. Nun, eine Schriftgröße für eine bestimmte Schriftart wäre ausreichend.

Etwas wie folgt aus:

public int getFontSizeForDrawArea(int width, int height, String text, Font font) { 
    //Pseudo class FontMeasureClass takes a font to do the measures with 
    FontMeasureClass measure = new FontMeasureClass(font); 

    // method takes size of frame/component and text to return the needed 
    // font size to fit text to frame/component 
    return measure.getFontSize(width, height, text); 
} 

Ich denke, ein Verfahren zu machen, die die Größe eines Textes misst, indem in einer Schleife wieder versuchen, bis die Größe so nah wie viel zu den Fenstern Widht und Höhe. Aber vielleicht gibt es etwas bereit zu verwenden.

Antwort

2

Eine Möglichkeit, die Breite des String in Pixel zu messen, ist diese:

Font myfont = jTextField1.getFont();  
FontMetrics myMetrics = getFontMetrics(myfont); 
int width=SwingUtilities.computeStringWidth(myMetrics, jTextField1.getText()); 

und hier ist eine andere, die zusätzlich in Pixel und es ist Höhe berechnet:

Font myFont = new Font("Arial", Font.PLAIN, 10); 
FontMetrics myMetrics = new FontMetrics(myFont) {}; 
Rectangle2D boundsOfString = myMetrics.getStringBounds("Measure this String", null); 
int width = (int) boundsOfString.getWidth(); 
int height = (int) boundsOfString.getHeight(); 

I würde es mit der oben erwähnten Schleife tun.

+0

Ok noch muss ich eine Schleife durchlaufen und stoppe, wenn die zurückgegebene Breite der Fensterbreite am nächsten ist. – NovumCoder

+0

Ja. Die Schleife sollte einfach zu machen sein. Ich kenne keinen anderen Weg. –

+0

Warum zwei Antworten von derselben Person, anstatt die ursprüngliche Antwort zu bearbeiten? –

2

Sie könnten die Breite berechnen und Ihren Text in einer großen Schrift malen und die Größe mit Graphics2D.scale ändern. Normalerweise erhält die paintComponent-Methode ein Graphics2D-Objekt, sodass Sie das Graphics-Objekt, das Sie in Graphics2D erhalten haben, umwandeln können.

+0

Obwohl der Font-Renderer von Java nicht besonders gut ist, kann das Rendern des Textes mit einer anderen Größe und späterer Größenanpassung zu einer viel schlechteren Bildqualität führen, als wenn die Schriftart in der richtigen Größe gerendert wird. – jarnbjo

+0

Ich habe die Frage verstanden, dass der OP den Text bei allen Rahmengrößen "perfekt" anpassen möchte. Der Versuch, die Textgröße zu finden, die am besten passt, würde zu "Größensprüngen" führen, wenn das Fenster ständig in der Größe verändert wird. Ich konnte mir keinen anderen Weg vorstellen, dies zu tun. Außerdem glaube ich, dass das Herunterskalieren eines großen Texts zu einer besseren Qualität führt als das Upscaling eines kleineren Textes. Eine kombinierte Lösung wäre, die Textgröße zu finden, die nur "ein bisschen zu groß" ist, und dann den Text in dieser Größe ein wenig zu verkleinern, aber ich weiß nicht, ob das besser aussieht. – nokul

+0

Ab Java 6, mit aktiviertem Subpixel AA, wird die Skalierung auf diese Weise perfekt. –

0

Sie müssen keine Schleife verwenden, sondern können nach einer Fehlberechnung eine geeignete Schriftgröße schätzen, da die meisten Schriftarten proportional skaliert werden (obwohl Schriftarten unterschiedliche Zeichen für verschiedene Größen enthalten können).

z. Wenn Ihr Malbereich 1000 Pixel breit ist und die berechnete Breite für eine Schriftgröße von 100 Punkten 1250 Pixel beträgt, sollte eine Schriftgröße von 100 Pixel * 1000 Pixel/1250 Pixel = 80 Pixel zu einer Breite von 1000 Pixel führen.