当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX中计算字符串的像素宽度?

闽焕
2023-03-14

在JavaFX2.2中,似乎没有API调用来计算文本字符串的宽度(以像素为单位)。在其他论坛上也有关于解决方法的建议,但我使用默认字体或其他方式创建或查找返回字符串宽度的代码的努力失败了。任何帮助都将不胜感激。

共有3个答案

魏安宁
2023-03-14

此解决方案在java 8之前一直有效:

float width = com.sun.javafx.tk.Toolkit.getToolkit().getFontLoader().computeStringWidth("", gc.getFont());
float height = com.sun.javafx.tk.Toolkit.getToolkit().getFontLoader().getFontMetrics(gc.getFont()).getLineHeight();

这些类已被删除,在较新的java版本中不可用!

朱运诚
2023-03-14

我试过这个:

Text theText = new Text(theLabel.getText());
theText.setFont(theLabel.getFont());
double width = theText.getBoundsInLocal().getWidth();

它似乎工作得很好。

子车睿
2023-03-14

如果您只是测量没有CSS的默认字体:

  1. 将要测量的字符串放在文本对象中。
  2. 获取文本对象布局边界的宽度

如果您需要应用CSS:

  1. 在Text对象中放置要测量的String。
  2. 创建一个一次性场景,并将文本对象放置在场景中。
  3. 获取文本的快照(如果您使用Java7)或调用应用程序8Java。
  4. 获取Text对象的布局边界的宽度。

这是因为它强制文本上的布局传递,从而计算其布局边界。步骤2中的场景是必需的,因为这正是CSS处理器的工作方式(它需要一个节点位于场景中才能完成它的工作)。如果您想进一步了解处理过程,一定要阅读applyCss的链接javadoc。

样本代码

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.text.Text;
import javafx.stage.Stage;

// displays the width in pixels of an arbitrary piece of text.
public class MeasureText extends Application {
  public static void main(String[] args) { launch(args); }
  @Override public void start(Stage stage) throws Exception {
    final Text text = new Text("XYZZY");
    new Scene(new Group(text));

    // java 7 => 
    //    text.snapshot(null, null);
    // java 8 =>
    text.applyCss(); 

    final double width = text.getLayoutBounds().getWidth();

    stage.setScene(new Scene(new Label(Double.toString(width))));
    stage.show();
  }
}

示例程序输出(以像素为单位显示任意文本的宽度):

如果文本以设置的字体打印到graphicscontext,这种情况会发生什么变化?

将字体应用于文本对象,该文本对象包含将在画布上打印的相同消息。与测量绘制到场景图形的文本时不同,绘制到画布的项目没有应用CSS,因此在测量文本之前,不需要将文本对象放置在场景中并应用CSS。您可以测量文本对象的布局边界,它将与使用相同字体在画布中打印的文本的边界相同。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.*;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.text.*;
import javafx.stage.Stage;

// displays the width in pixels of an arbitrary piece of text (which has been plotted on a canvas).
public class MeasureText extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        final String msg = "XYZZY";
        final Text text = new Text(msg);
        Font font = Font.font("Arial", 20);
        text.setFont(font);

        final double width = text.getLayoutBounds().getWidth();

        Canvas canvas = new Canvas(200, 50);
        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.setFont(font);
        gc.fillText(msg, 0, 40);

        stage.setScene(new Scene(
                new VBox(new Label(Double.toString(width)), canvas))
        );
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 类似资料:
  • 在JavaFX2.2中,似乎没有API调用来计算文本字符串的宽度(以像素为单位)。在其他论坛上也有关于解决方法的建议,但我使用默认字体或其他方式创建或查找返回字符串宽度的代码的努力失败了。任何帮助都将不胜感激。

  • 问题内容: 如何在Java中以像素为单位计算a的宽度? 例如,我有一个字符串说“ Hello World!”。 考虑到其字体系列和大小,它的像素长度是多少? 问题答案: 有多种方法可以实现想要的目标,例如,基于要实现的目标。 但这仅与上下文相关,并且不会转换为屏幕或打印机之类的内容。 但是,只要您具有上下文,就可以实现相同的结果。 显然,此示例使用了为上下文安装的默认字体,如果需要,可以更改…

  • 如何在Java中计算的宽度(以像素为单位)?例如,我有一个字符串说“你好世界!它的长度是多少(以像素为单位),还要考虑它的字体系列和大小?

  • 问题内容: 我想在 android中 以像素为单位计算字符串字体宽度。我有字符串数组,我将所有这些数组元素附加到一个字符串中。所以我必须在两个连续的数组元素之间设置固定的间距。我将最后一个字符串放入textview中。最后,我将这个textview添加到tablerow中。简而言之,我想查看带有标题和值的表结构。我在这里看到过很多帖子,但没有得到解决方案。 提前致谢…!!! 问题答案: 似乎上有可

  • 问题内容: 我需要编写某种循环,可以计算字符串中每个字母的频率。 例如:“ aasjjikkk”将计为2’a’,1’s’,2’j’,1’i’,3’k’。最终,像这样的id最终以字符为键,而count为值的形式出现在地图中。有什么好主意怎么做? 问题答案: 你可以使用Java Map并将a映射到。然后,你可以遍历字符串中的字符,并检查是否已将它们添加到地图中(如果有),然后可以增加其值。 例如: 最

  • 问题内容: 如何计算特定字符串在另一个字符串中出现的次数。例如,这就是我要使用Javascript进行的操作: 问题答案: 在正则表达式(简称 全球 )说,搜索整个字符串,而不是只要找到第一次出现。这匹配两次: 并且,如果没有匹配项,则返回: