Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Css JavaFX:获取TextArea的行高度_Css_Javafx_Textarea - Fatal编程技术网

Css JavaFX:获取TextArea的行高度

Css JavaFX:获取TextArea的行高度,css,javafx,textarea,Css,Javafx,Textarea,我有一个窗口/舞台和一个TextArea,它将根据TextArea中文本的长度调整大小(文本被包装)。这意味着,窗口越小,文本区域内的文本就越少。文本区域的宽度是给定的。为了计算TextArea的高度,我使用文本的长度、给定的TextArea宽度和行高。例如: 双倍高度=textwidth/agreement.getWidth()*18 在这种情况下,线高度由静态值定义。但是行高必须根据css文件中的定义而变化,因为如果字体大小的定义改变,行高也会改变。因此,我需要确定TextArea的行高度以

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

双倍高度=textwidth/agreement.getWidth()*18


在这种情况下,线高度由静态值定义。但是行高必须根据css文件中的定义而变化,因为如果字体大小的定义改变,行高也会改变。因此,我需要确定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();

通过将高度设置为足以包含所有文本而无需滚动的值,从文本区域移除垂直滚动条是否有问题?不,滚动条不重要。如果文本区域太大(大于屏幕大小的一半),可以使用它。如果文本区域小于屏幕大小的一半,则应具有其中文本的高度。在另一种情况下,它的高度为屏幕的一半,滚动条在文本区域内使用此功能,谢谢:)如果未显示舞台,您还知道解决方案吗?目前,我正在使用您的解决方案,并在第一次显示阶段时立即隐藏它(这不是一个好方法,但它可以工作;)。在此之后,我借助文本区域的高度重新计算舞台的大小,并再次显示舞台。是的,我已经用正确的方式编辑了我的答案,谢谢你的编辑。我尝试了那个解决方案,但我得到了一个错误,即.applyCss()未定义。不管我是否将其应用于场景、StackPane、AnchorPane等等,它是否可能只是用于JavaFX8?我正在用JavaFX2实现一切。如果是这样,我仍将使用您的第一个解决方案;)是的,你是对的,
applyCss()
是自JavaFX8以来新出现的。