如何计算在JavaFX的字符串的像素宽度?(How to calculate the pixel w

2019-06-18 14:37发布

看来,有没有API调用来计算的Java FX 2.2文本字符串的宽度(以像素为单位)。 已经有其他论坛的解决方法的建议,但我的努力创造或发现返回一个字符串的宽度任何代码,或者使用默认字体或以其他方式,都失败了。 任何帮助,将不胜感激。

Answer 1:

如果你是刚刚测量的默认字体没有CSS:

  1. 放置在文本对象要被测量的字符串。
  2. 获取文本对象的布局界限的宽度。

如果您需要申请CSS:

  1. 放置在文本对象要被测量的字符串。
  2. 创建一个一次性的场景,把文本对象的场景。
  3. 以文本的快照(如果你使用的是Java 7),或致电applyCss为Java 8。
  4. 获取文本对象的布局界限的宽度。

这工作,因为它迫使上计算它的布局界限的文本布局传递。 在步骤2中的场景需要,因为这是现在的样子的CSS处理器的作品(它需要被位于场景中的节点,以便能够完成它的工作)。 如果您想进一步了解处理绝对读取applyCss链接的javadoc。

示例代码

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

示例程序输出(显示在文本中的任意一块的像素宽度):

如何(如果有的话)会如果文本印刷这种变化与一组字体的graphicscontext?

应用字体包含您将绘制在画布相同的消息文本对象。 不像当你测量文本绘制场景图,项目绘制在画布应用到他们的CSS不具备的,所以你不必放置在场景中的文本对象,并具有适用于它的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);
    }
}


Answer 2:

该解决方案的工作,直到8的java:

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版本!



Answer 3:

我尝试这样做:

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

这似乎是工作的罚款。



Answer 4:

Bounds bounds = TextBuilder.create().text(text).font(font).build().getLayoutBounds();
double width=bounds.getWidth();
double height=bounds.getHeight();


文章来源: How to calculate the pixel width of a String in JavaFX?