2017-06-19 6 views
0

幅の値のためにフォントサイズを計算したいと思います。ユースケースJavaFXフォントサイズから幅

テキスト"PLAY MONEY"¹を持っているボタンについて考えてみよう:

Similar SO Question to Java AWT 2


編集

Similiar SO Question to Java AWT

//Custom Font 
Font.loadFont(Fonts.class.getResourceAsStream("/font/bignood/bignoodletoo.ttf"), 10) 
String text = "Hello World"; 
Double width = 100; 

。 これをPT_BRに翻訳し、今すぐ"DINHEIRO FICTICIO"²と呼んでいます。 ご覧のとおり、単語²は単語¹よりも大きいので、同じFont Sizeと設定すると、ボタン内にDINHEIRO FIC...が表示されます。

だからここ使命はtextを取得し、私はtextを変更するたびに、Button内のフルテキストに合わせてFont Sizeを適用し、Buttonwidth値を取得することです。

+1

あなたは(シーンか何かのような)の幅を取得したいものに、もう少し具体的にすることができ、どのように大規模なあなたはそれと比較されるフォントをしたいですか? – Austin

+0

@Austin、ボタンからの幅、ラベルeなど。テキストを持つオブジェクト。カスタムフォントのテキストは、正確に幅の値に収まる必要があります。 – Marckaraujo

+0

テキストは 'Button' /' Label'に収まる必要がありますか?後者2にはテキストの余白が含まれています。 – fabian

答えて

3

以下は、これに役立つfindFontSizeThatCanFit()メソッド(およびデモ)です。

See it in action online

public class FxFontMetrics { 
    public static void main(String[] args) { 
     int maxWidth = 100; 
     System.out.println("# Text -> Font size that can fit text under " + maxWidth + " pixels"); 
     Stream.of(
       "DINHEIRO FICTICIO", 
       "Dinheiro ficticio", 
       "PLAY MONEY", 
       "Play money", 
       "Devise factice qui compte pour du beurre") 
       .forEach(text -> { 
        double size = findFontSizeThatCanFit(Font.font("dialog", 45), text, maxWidth); 
        System.out.println(text + " -> " + size); 
       }); 
    } 

    private static double findFontSizeThatCanFit(Font font, String s, int maxWidth) { 
     double fontSize = font.getSize(); 
     double width = textWidth(font, s); 
     if (width > maxWidth) { 
      return fontSize * maxWidth/width; 
     } 
     return fontSize; 
    } 

    private static double textWidth(Font font, String s) { 
     Text text = new Text(s); 
     text.setFont(font); 
     return text.getBoundsInLocal().getWidth(); 
    } 
} 

それは出力します。

# Text -> Font size that can fit text under 100 pixels 
DINHEIRO FICTICIO -> 10.475703324808185 
Dinheiro ficticio -> 12.757739986295396 
PLAY MONEY -> 15.587183195068118 
Play money -> 17.152428810720266 
Devise factice qui compte pour du beurre -> 4.795354500327807 
+0

それは動作しますが、それは "それが何であれ広すぎる"(すべての繰り返しで新しいフォント/テキストオブジェクトを作成する必要があるため...)。私はJava AWTのためにリンクされた 'SO question 1'で使われている' GraphicsContext'で何かを期待していました。 – Marckaraujo

+0

ああ、そうですね、除算を使ってループを回避することができます(丸められていない値が許されない場合、 'Math.floor()'を使用します)。私は答えを編集しました。これにはまだダミーの 'Text'ノードが作成されますが、新しい' Font'オブジェクトは必要ありません。しかし、これはフォントがそのサイズに比例した形で与えられたテキストをレンダリングすると仮定していますが、現実には常に線形です。 –

関連する問題