在Java FX 2.2中似乎没有API调用来计算文本字符串的宽度(以像素为单位)。在其他论坛上也有解决方法的建议,但是我创建或查找使用默认字体或其他方式返回String宽度的任何代码的工作都失败了。任何帮助,将不胜感激。
如果仅在不使用CSS的情况下测量默认字体,请执行以下操作:
如果你需要应用CSS:
样例代码
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); } }