JavaFX:获取TextArea的行高

JavaFX: Get line height of TextArea

我有一个 window/stage 和一个 TextArea,它将根据 TextArea 内文本的长度调整大小(文本被换行)。这意味着,window 越小,TextArea 中的文本就越少。 TextArea 的宽度是给定的。为了计算 TextArea 的高度,我使用文本的长度、TextArea 的给定宽度和行高。例如:

double height=textwidth/agreement.getWidth()*18;

在这种情况下,行高由静态值定义。但是行高必须是可变的,具体取决于 css 文件中的定义,因为如果字体大小的定义发生变化,行高也会发生变化。因此,我需要确定 TextArea 的行高才能使用它而不是使用静态值。那么,如何获取 TextArea 的行高呢?

舞台显示后,您可以找到文本区域中呈现的文本的确切尺寸:

@Override
public void start(Stage primaryStage) {
    TextArea area = new TextArea("This is some random very long text");
    area.setWrapText(true);
    area.setPrefWidth(200);
    area.setMaxWidth(200);
    area.setStyle("-fx-font: 18pt Arial");
    StackPane root = new StackPane(area);

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setScene(scene);
    primaryStage.show();

    Text t = (Text)area.lookup(".text");
    System.out.println("LayoutX "+t.getLayoutX());
    System.out.println("LayoutY "+t.getLayoutY());
    System.out.println("Width: "+t.getBoundsInLocal().getWidth());
    System.out.println("Height: "+t.getBoundsInLocal().getHeight());
}

根据这些维度,您可以进行计算。

编辑

您可以在展示舞台之前获取尺寸,但为此您需要将 CSS 样式应用于根和子级并在场景中强制布局:

    Scene scene = new Scene(root, 300, 250);

    root.applyCss();
    root.layout();

    Text t = (Text)root.lookup(".text");
    System.out.println("LayoutX "+t.getLayoutX());
    System.out.println("LayoutY "+t.getLayoutY());
    System.out.println("Width: "+t.getBoundsInLocal().getWidth());
    System.out.println("Height: "+t.getBoundsInLocal().getHeight());

    // Now calculations can be performed

    primaryStage.setScene(scene);
    primaryStage.show();