【问题标题】:JavaFX font size from widthJavaFX字体大小从宽度
【发布时间】:2017-06-30 22:53:26
【问题描述】:

由于宽度值,我想计算字体大小。

//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"²。 如您所见,word² 大于 word¹,因此如果您设置相同的 Font Size,那么您会在按钮内看到 DINHEIRO FIC...

所以这里的任务是获取Buttonwidth 值,获取text 并应用Font Size 以适应Button 中的全文,每当我更改text 时。

【问题讨论】:

  • 您能否更具体地说明您想要获得的宽度(如场景或其他东西),以及您希望将字体与其进行比较的大小?
  • @Austin,我将从按钮、标签 e 等获得的宽度。任何有文本的对象。具有自定义字体的文本需要完全适合宽度值。
  • 文字需要适合还是Button/Label?后 2 包括文本的边距...
  • @fabian,文本需要适合任何宽度值。我将用一个用例更新问题。

标签: java javafx fonts


【解决方案1】:

以下是对此有用的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

【讨论】:

  • 它可以工作,但它“对于它的本质来说太宽泛了”(因为我必须在每次迭代时创建一个新的字体/文本对象......)。我期待 GraphicsContext 在链接的 SO question 1 for Java AWT 中使用的东西。
  • 啊,是的,我们可以通过使用除法来避免循环(如果不允许或不希望使用非圆形值,请使用Math.floor())。我编辑了答案。这仍然涉及创建一个虚拟的Text 节点,但不需要新的Font 对象,对吧。但这是假设字体以与其大小成比例的方式呈现给定文本,但我不确定它在现实中总是线性的:-/
  • 您可以在textWidth(...) 中使用private static Text 对象,而不是每次调用都创建一个新的Text,对吗?
猜你喜欢
  • 2013-01-01
  • 2012-08-23
  • 1970-01-01
  • 2017-05-11
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多