Comment calculer la largeur de pixel d'une chaîne de caractères dans JavaFX?

il semble qu'il n'y ait pas D'appel API pour calculer la largeur (en pixels) d'une chaîne de texte dans Java FX 2.2. Il y a eu des suggestions de solutions de rechange sur d'autres forums, mais mes efforts pour créer ou trouver n'importe quel code qui retourne la largeur d'une chaîne, en utilisant la police par défaut ou autrement, ont échoué. Toute aide serait appréciée.

23
demandé sur Don Wills 2012-10-22 20:30:04

4 réponses

si vous ne faites que mesurer la police par défaut sans CSS:

  1. placer la chaîne à mesurer dans un objet texte.
  2. Obtenir la largeur de l'objet de Texte, mise en page de limites.

Si vous avez besoin d'appliquer le CSS:

  1. placer la chaîne à mesurer dans un objet texte.
  2. créer une scène de throwaway et placer l'objet texte dans la scène.
  3. Prendre un instantané du Texte (si vous utilisez Java 7) ou appel applyCss pour Java 8.
  4. Obtenir la largeur de l'objet de Texte, mise en page de limites.

cela fonctionne parce qu'il force un passage de layout sur le texte qui calcule ses limites de layout. La scène de l'étape 2 est nécessaire parce que c'est juste la façon dont le processeur CSS fonctionne (il a besoin d'un noeud pour être situé dans une scène pour pouvoir faire son travail). Certainement lire le javadoc lié pour applyCss si vous voulez comprendre le traitement plus.

Exemple De 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();
  }
}

exemple de sortie de programme (affiche la largeur en pixels d'un morceau de texte arbitraire):

Sample Program Output

comment (le cas échéant) cela changerait-il si le texte était imprimé en texte graphique avec une police définie?

l'Appliquer à un objet texte contenant le même message de la parcelle à la toile. Contrairement à quand vous mesurez le texte tracé à la graphe de scène, les éléments de tracé pour une toile n'ont pas de feuille de style CSS appliquée à eux, de sorte que vous n'avez pas besoin de placer le Texte de l'objet dans une scène et CSS appliquée à elle avant de mesurer le texte. Vous pouvez mesurer les limites de la mise en page de votre objet texte et il sera le même que les limites du texte tracées dans la toile avec la même police.

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
répondu jewelsea 2017-02-01 19:19:14

Cette solution fonctionne jusqu'à 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();

ces classes ont depuis été supprimées et ne sont pas disponibles dans la nouvelle version java!

15
répondu Stas 2018-04-27 04:40:02

j'ai essayé ceci:

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

et il semble fonctionner correctement.

9
répondu Leonardo Santos 2016-12-26 03:41:46
Bounds bounds = TextBuilder.create().text(text).font(font).build().getLayoutBounds();
double width=bounds.getWidth();
double height=bounds.getHeight();
1
répondu dongfangshangren 2014-03-06 11:21:27