Измерить ширину текста JavaFX 8 без пакета com.sun.tk [дублировать]

Вместо этого используйте re.findall или re.finditer.

re.findall(pattern, string) возвращает список соответствующих строк.

re.finditer(pattern, string) возвращает итератор над объектами MatchObject .

23
задан Don Wills 22 October 2012 в 17:30
поделиться

4 ответа

Если вы просто измеряете шрифт по умолчанию без CSS:

  1. Поместите String для измерения в текстовом объекте.
  2. Получите ширину макета текстового объекта

Если вам нужно применить CSS:

  1. Поместите строку, подлежащую измерению в текстовом объекте.
  2. Создайте throwaway Сцена и поместите объект Text в сцену.
  3. Сделайте снимок текста (если вы используете Java 7) или вызовите applyCss для Java 8.
  4. Получить ширину границ макета текстового объекта.

Это работает, потому что он заставляет макет передать текст, который вычисляет его границы макета. Сцена на шаге 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();
  }
}

Пример выходного файла программы (отображает ширину в пикселях произвольного фрагмента текста ):

Sample Program Output [/g1]

Как (если вообще) это изменится, если текст будет напечатан в графическом контексте с заданным шрифтом?

Применить шрифт к текстовому объекту, содержащему одно и то же сообщение, которое вы будете рисовать на холсте. В отличие от того, когда вы измеряете текст, нанесенный на график сцены, элементы, нанесенные на холст, не применяют к ним 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);
    }
}
31
ответ дан jewelsea 25 August 2018 в 06:12
поделиться
Bounds bounds = TextBuilder.create().text(text).font(font).build().getLayoutBounds();
double width=bounds.getWidth();
double height=bounds.getHeight();
1
ответ дан dongfangshangren 25 August 2018 в 06:12
поделиться

Я пробовал это:

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

и, похоже, работает нормально.

8
ответ дан Leonardo Santos 25 August 2018 в 06:12
поделиться

Это решение работает до тех пор, пока 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!

14
ответ дан Lonely Neuron 25 August 2018 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: