2011-01-11 13 views
4

私のフレーム/コンポーネントに大きな "hello world"をペイントしようとしています。 しかし、私はそれを動的にウィンドウサイズに合わせたいと思っています。だから毎回私はウィンドウのサイズを完全に合わせる必要がありますウィンドウのサイズを変更します。Java:ペイントされたテキストをウィンドウに動的にフィットさせる方法

私はFontMetricsクラスを使用してフォントを割り当て、文字の幅と高さを測定します。

しかし、コンポーネントのサイズをテキストで渡して、メソッドが使用する必要のあるフォントを返すことをお勧めします。まあ、特定のフォントのフォントサイズで十分でしょう。このような

何か:

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); 
} 

私はサイズがwidht窓や高さにかなり限り近くなるまで、ループの中でしようとすると、テキストの大きさを測定する方法を行うことを考えます。しかし、おそらく何か使用する準備ができています。ピクセル単位で、あなたの文字列の幅を測定する

答えて

2

一つの方法は、このいずれかです:私は

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(); 

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

、ここでは、さらに、それは同様にピクセル単位の高さです計算し、別の1であり、あなたが上記のループでそれを行うだろう。

+0

でも、返された幅がウィンドウの幅に最も近い場合、ループを通過して停止する必要があります。 – NovumCoder

+0

はい。ループは簡単に作成できます。私は他の方法を知らない。 –

+0

なぜ元の回答を編集するのではなく、同じ人が2つの回答を返すのですか? –

2

大きなフォントでテキストの幅とペイントを計算し、Graphics2D.scaleでサイズを変更できます。通常、paintComponent-MethodはGraphics2Dオブジェクトを受け取るので、Graphics2Dに入っているGraphicsオブジェクトをキャストできます。

+0

Javaのフォントレンダラーはあまりよくありませんが、テキストを異なるサイズでレンダリングした後にサイズを変更すると、フォントが正しいサイズでレンダリングされた場合よりも画質が大幅に低下する可能性があります。 – jarnbjo

+0

OPはすべてのフレームサイズでテキストを「完璧に」フィットさせたいという質問を理解しました。ウィンドウのサイズを連続的に変更すると、最適なテキストサイズを見つけると「サイズジャンプ」になります。私はこれを行う別の方法を考えることができませんでした。また、大きなテキストを縮小すると、小さなテキストを拡大するよりも品質が向上すると私は考えています。結合された解決策は、ちょうど「少し大きすぎる」テキストサイズを見つけて、そのサイズで描かれたテキストを少し縮小することですが、それがより良く見えるかどうかはわかりません。 – nokul

+0

Java 6では、サブピクセルAAをオンにして、このようにスケーリングすると完全にレンダリングされます。 –

0

ループを使用する必要はありませんが、誤った計算を行った後に適切なフォントサイズを見積もることができます。ただし、ほとんどのフォントは比例してスケールされます。

など。ペイント領域の幅が1000pxで、フォントサイズが100ptの場合の計算幅が1250pxの場合、100pt * 1000px/1250px = 80ptのフォントサイズは1000pxの幅になります。

関連する問題