2017-06-19 110 views
0

我想計算由於寬度值的字體大小。JavaFX字體大小從寬度

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

Similiar SO Question to Java AWT

Similar SO Question to Java AWT 2


編輯:用例

想想一個按鈕,有一個文本"PLAY MONEY"¹。 現在我會將文字翻譯成PT_BR,現在撥打電話"DINHEIRO FICTICIO"²。 正如你所看到的,字²比字¹大,所以如果你設置相同的Font Size那麼你會看到按鈕內的DINHEIRO FIC...

所以這裏的任務就是讓Buttonwidth值,得到text並應用Font Size以適應Button裏面的全文,每當我改變text

+1

你能想得到的寬度(就像一個場景或某事),你可以在一個更具體一點,怎麼大你想要將字體與它進行比較? – Austin

+0

@奧斯汀,我將從按鈕,標籤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

它可以工作,但它對於它是「太廣泛了」(因爲我必須在每次迭代中創建一個新的字體/文本對象...)。我正在期待''GraphicsContext'的一些東西,就像Java AWT的鏈接'SO question 1'一樣。 – Marckaraujo

+0

啊,是的,我們可以通過使用除法來避免循環(如果不允許或不需要非循環值,請使用'Math.floor()')。我編輯了答案。這仍然涉及創建一個虛擬「文本」節點,但不需要新的「字體」對象,對。但是這是假定字體以與其大小成正比的方式呈現給定文本,但我不確定它在現實中總是線性的: - / –

相關問題