как рассчитать ширину пикселя строки в javafx?

<p>похоже, что в java fx 2.2 нет вызова api для вычисления ширины (в пикселях) текстовой строки. на других форумах предлагались обходные пути, но мои попытки создать или найти какой-либо код, который возвращает ширину строки, используя шрифт по умолчанию или иным образом, потерпели неудачу. любая помощь будет оценена.</p>

<p>если вы просто измеряете шрифт по умолчанию без css:</p><ol> <li>поместите строку для измерения в текстовый объект.</li> <li>получите ширину границ макета объекта text.</li> </ol><p>если вам нужно применить css:</p><ol> <li>поместите строку для измерения в текстовый объект.</li> <li>создайте одноразовую сцену и поместите текстовый объект в сцену.</li> <li>сделайте снимок текста (если вы используете java 7) или вызовите <a href="http://docs.oracle.com/javase/8/javafx/api/javafx/scene/node.html#applycss--">applycss</a> для java 8.</li> <li>получите ширину границ макета объекта text.</li> </ol><p>это работает, потому что он вызывает передачу макета для текста, который вычисляет его границы макета . сцена в шаге 2 требуется, потому что это именно так, как работает процессор css (ему нужен узел, который должен быть расположен в сцене, чтобы быть в состоянии сделать свою работу). обязательно прочитайте связанный javadoc для applycss, если вы хотите понять обработку дальше.</p><p><strong>образец кода</strong></p><pre><code>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(); } } </code></pre><p>пример программы вывода (отображает ширину в пикселях произвольного фрагмента текста):</p><p><img src="https://i.stack.imgur.com/moukn.png" alt="sample program output"></p><blockquote> <p>как (если вообще) это изменится, если текст будет напечатан в графическом тексте с заданным шрифтом? </p> </blockquote><p>примените шрифт к текстовому объекту, содержащему то же сообщение, которое вы будете наносить на холст. в отличие от измерения текста, нанесенного на график сцены, для элементов, нанесенных на холст, к ним не применяется css, поэтому вам не нужно помещать объект text в сцену и применять css к нему перед измерением текста. вы можете измерить границы макета вашего текстового объекта, и он будет таким же, как границы текста, нанесенного на холст с тем же шрифтом.</p><pre><code>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); } } </code></pre>

<p>это решение работает до java 8:</p><pre><code>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(); </code></pre><p>с тех пор эти классы были удалены и недоступны в более новой версии java!</p>

<p>я попробовал это:</p><pre><code>text thetext = new text(thelabel.gettext()); thetext.setfont(thelabel.getfont()); double width = thetext.getboundsinlocal().getwidth(); </code></pre><p>и, кажется, работает нормально.</p>

<pre>bounds bounds = textbuilder.create (). text (text) .font (шрифт) .build (). getlayoutbounds (); double width = bounds.getwidth (); double height = bounds.getheight () ;</pre>