如何计算JavaFX中string的像素宽度?

看起来没有API调用来计算Java FX 2.2中文本string的宽度(以像素为单位)。 有其他论坛的解决方法的build议,但我的努力创build或查找任何代码,返回一个string的宽度,使用默认的字体或其他,都失败了。 任何帮助,将不胜感激。

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

  1. 将要测量的string放在Text对象中。
  2. 获取Text对象的布局边界的宽度。

如果你需要应用CSS:

  1. 将要测量的string放在Text对象中。
  2. 创build一个一次性场景,并将文本对象放置在场景中。
  3. 对文本进行快照(如果您正在使用Java 7)或者调用applyCss for Java 8。
  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(); } } 

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

示例程序输出

如果文本被打印到带有设置字体的graphics上下文,如何(如果有的话)会改变?

将字体应用于包含您将绘制到canvas上的相同消息的文本对象。 与测量绘制到场景graphics的文本不同的是,绘制到canvas上的项目没有应用CSS,所以在测量文本之前,不需要将Text对象放置在场景中并应用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); } } 

那这个呢:

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

我试过这个:

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

它似乎工作正常。

  Bounds bounds = TextBuilder.create().text(text).font(font).build()。getLayoutBounds();
 double width = bounds.getWidth();
 double height = bounds.getHeight();