Вместо этого используйте re.findall
или re.finditer
.
re.findall(pattern, string)
возвращает список соответствующих строк.
re.finditer(pattern, string)
возвращает итератор над объектами MatchObject
.
Если вы просто измеряете шрифт по умолчанию без CSS:
Если вам нужно применить CSS:
Это работает, потому что он заставляет макет передать текст, который вычисляет его границы макета. Сцена на шаге 2 требуется, потому что это именно то, как работает процессор CSS (для того, чтобы выполнять свою работу, нужен узел, который должен быть расположен в Сцене). Определенно прочитайте связанный javadoc для applyCss, если вы хотите понять дальнейшую обработку.
Пример кода
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();
}
}
Пример выходного файла программы (отображает ширину в пикселях произвольного фрагмента текста ):
[/g1]
Как (если вообще) это изменится, если текст будет напечатан в графическом контексте с заданным шрифтом?
blockquote>Применить шрифт к текстовому объекту, содержащему одно и то же сообщение, которое вы будете рисовать на холсте. В отличие от того, когда вы измеряете текст, нанесенный на график сцены, элементы, нанесенные на холст, не применяют к ним 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); } }
Bounds bounds = TextBuilder.create().text(text).font(font).build().getLayoutBounds(); double width=bounds.getWidth(); double height=bounds.getHeight();
Я пробовал это:
Text theText = new Text(theLabel.getText());
theText.setFont(theLabel.getFont());
double width = theText.getBoundsInLocal().getWidth();
и, похоже, работает нормально.
Это решение работает до тех пор, пока 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!