0

我正在尝试在屏幕外预渲染一些Text元素以检索它们的宽度,然后再在屏幕上渲染它们:

Group offScreenRoot = new Group();
Scene offScreen = new Scene(offScreenRoot, 1024, 768);
Set<Text> textSet = new HashSet<>();

Text textText = new Text(getText());
textSet.add(textText);

Text idText = new Text(getId());

textSet.add(idText);

for (String s : getStrings()) {
    textSet.add(new Text(s));
}
for (Text text : textSet) {
    text.setStyle("-fx-font-size: 48;"); // <- HERE!
    text.applyCss();
    offScreenRoot.getChildren().add(text);
}
for (Text text : textSet) {
    System.out.println(text.getLayoutBounds().getWidth());
}

我正在通过 CSS 应用较大的字体大小,但这并没有被采纳。相反,Text它尽可能宽,以默认字体大小呈现(我猜)。

有没有办法Text根据 CSS 字体大小渲染屏幕外并获取实际宽度值?

4

1 回答 1

0

我不确定你的代码的目的。使用MCVE会更容易,请记住下次。

我认为你犯了一些简单的错误。查看applyCss 定义您应该在父节点上应用 applyCss,而不是在节点上。
文档中另一件重要的事情是:

前提是节点的场景不为空

不幸的是,当你应用你的 CSS 时,文本的场景是空的,因为它还没有添加到他的父级。

text.applyCss();
offScreenRoot.getChildren().add(text);

因此,有两种解决方案,如以下代码中的注释所述(尤其是在将文本添加到父级的 for 循环中):

public class MainOffscreen extends Application {

   private List<String> stringsList = new ArrayList<>();

   @Override
   public void start(Stage primaryStage) throws Exception {
      // Populates stringsList
      stringsList.add("String1");
      stringsList.add("String2");
      stringsList.add("String3");
      stringsList.add("String4");

      VBox offscreenRootVbox = new VBox(10.0);
      Scene offScreen = new Scene(offscreenRootVbox, 900, 700);

      // Replace the Hashset by list in order to keep order, more interesting for testing.
      List<Text> textSet = new ArrayList();

      // Text text.
      Text textText = new Text("Text");
      textSet.add(textText);

      // Text id.
      Text idText = new Text("Id");
      textSet.add(idText);

      // Populate String list.
      for(String s: stringsList) {
         textSet.add(new Text(s));
      }

      // Print the width of Texts before applying Css.
      for(Text text: textSet) {
         System.out.println("BEFORE Width of " + text.getText() + " : " + text.getLayoutBounds().getWidth());
      }
      System.out.println("\n----------\n");

      for(Text text: textSet) {
         text.setStyle("-fx-font-size: 48;"); // <- HERE!
         // First add it to the parent.
         offscreenRootVbox.getChildren().add(text);

         // Either apply the CSS on the each Text, or Apply it on the parent's Text, I choose the
         // second solution.
         // text.applyCss();
      }
      // Apply the css on the parent's node
      offscreenRootVbox.applyCss();

      for(Text text: textSet) {
         System.out.println("AFTER Width of " + text.getText() + " : " + text.getLayoutBounds().getWidth());
      }

      // primaryStage.setScene(offScreen);
      // primaryStage.show();
   }
}

它给出了这个输出:

BEFORE Width of Text : 22.13671875
BEFORE Width of Id : 10.259765625
BEFORE Width of String1 : 37.845703125
BEFORE Width of String2 : 37.845703125
BEFORE Width of String3 : 37.845703125
BEFORE Width of String4 : 37.845703125

----------

AFTER Width of Text : 88.546875
AFTER Width of Id : 41.0390625
AFTER Width of String1 : 151.3828125
AFTER Width of String2 : 151.3828125
AFTER Width of String3 : 151.3828125
AFTER Width of String4 : 151.3828125

希望这对您有所帮助。

于 2018-03-22T10:00:35.963 回答