如果仅在没有CSS的情况下测量默认字体,请执行以下操作:
将要测量的字符串放在Text对象中。
获取Text对象的布局范围的宽度。
如果您需要应用CSS:
将要测量的字符串放在Text对象中。
创建一个一次性场景并将Text对象放置在场景中。
拍摄文本快照(如果您使用的是Java 7),或者为Java 8 调用applyCss。
获取Text对象的布局范围的宽度。
之所以可行,是因为它会强制在Text上进行布局传递,以计算其布局范围。需要步骤2中的场景,因为这只是CSS处理器的工作方式(它需要一个节点位于Scene中才能执行其工作)。如果您想进一步了解处理过程,请绝对阅读适用于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();
}
}
示例程序输出(显示任意文本的宽度(以像素为单位)):
示例程序输出
如果将文本以设置的字体打印到图形上下文中,这将如何(如果有的话)发生变化?
将字体应用于包含与绘图相同的消息的文本对象。与测量在场景图上绘制的文本不同,在画布上绘制的项目没有应用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);
}
}