java - 如何使用 FXML 和 JavaFX 动态创建 TextFlow 时保留新行字符

标签 java javafx fxml fxmlloader

以下代码动态创建一个 TextFlow 和 Text,其中最初包含换行符(可能是图像和其他 Pane )。

InputStream stream = new ByteArrayInputStream(text.toString().getBytes(StandardCharsets.UTF_8));
      TextFlow element = new FXMLLoader().load(stream);

但是,带有 FXML 的 ByteArrayInputStream 方法会删除所有新行。

尝试过使用 Windows 和 Unix 的行尾字符,无论如何这都不会有什么不同,但是当你徒劳地尝试不同的组合时,你就会达到这一点。

通常是recommended to use a BufferedReader恢复新线路,但这里我无法控制。其他加载方法似乎采用 URL 和资源链接,但这是一个经过操作的字符串。

示例

java代码:

package simpleexample;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;

import com.jcabi.xml.XMLDocument;

public class TestFxmlWithBreaks extends Application {


  @Override
  public void start(Stage primaryStage) {
    Scene scene = new Scene(createEntry(), 750, 750, Color.web("#666970"));
    primaryStage.setScene(scene);
    primaryStage.show();

  }


  private VBox createEntry() {
    VBox entryBox = new VBox();
    entryBox.setFillWidth(true);

    entryBox.setSpacing(20);
    entryBox.setMaxWidth(750);

    try {
      XMLDocument test = new XMLDocument(this.getClass().getResourceAsStream("inputFxml.xml"));
      System.out.println(test.toString());

      InputStream stream = new ByteArrayInputStream(test.toString().getBytes(StandardCharsets.UTF_8));
      TextFlow element = new FXMLLoader().load(stream);
      element.setMaxWidth(750);

      entryBox.getChildren().add(element);
    } catch (Exception e) {
      //log something
    }

    return entryBox;
  }


  public static void main(String[] args) {
  launch(args);
  }



}

inputFxml.xml:

<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.text.*?><TextFlow xmlns:fx="http://javafx.com/fxml" styleClass="paragraph">
<Text style="-fx-font-size: 20;">A list of stuff</Text>
<Text>
* stuff
* more stuff
* even more stuff, all with new lines
</Text>
<Text style="-fx-font-size: 15;">This should demonstrate it</Text>
</TextFlow>

最佳答案

因此,在出现更好的解决方案之前,我选择了插入标记字符串,然后在加载 fxml 后替换它的黑客方法。

不是很好,但足以满足我的用例。

public void markNewLinesInXmlTextNodes(Node node) { //w3c node
    for(int i = 0 ; i < node.getChildNodes().getLength() ; i++) {
      Node child = node.getChildNodes().item(i);
      markNewLinesInXmlTextNodes(child);
    }
    if (node instanceof Element) {
      Element el = (Element) node;
      if (el.getTagName().toLowerCase().equals("text")) {
        el.setTextContent(el.getTextContent().replaceAll("\n", "_LINEBREAK_"));
      }
    }
  }

  public void addNewLinesInFxTextNodes(javafx.scene.Node node) {
    if (node instanceof javafx.scene.Parent) {
      javafx.scene.Parent parent = (javafx.scene.Parent) node;
      for(int i = 0 ; i < parent.getChildrenUnmodifiable().size() ; i++) {
        javafx.scene.Node child = parent.getChildrenUnmodifiable().get(i);
        addNewLinesInFxTextNodes(child);
      }
    }
    if (node instanceof javafx.scene.text.Text) {
      Text el = (Text) node;
      el.setText(el.getText().replaceAll("_LINEBREAK_", "\n"));
    }
  }

关于java - 如何使用 FXML 和 JavaFX 动态创建 TextFlow 时保留新行字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34122384/

相关文章:

java - 有没有办法模块化 JavaFX 应用程序?

java - NullPointerException 尽管 fx :id and fx:controller are correct

java - 按严格顺序运行 JUnit5 测试

java - 如何向 JAXB 中的文本元素添加属性?

java - 泛型中的通配符是对象还是对象的数据?

JavaFX - 如何更改选定未聚焦行的 TableView 颜色?

javascript - JavaFX8 JavaScript 通过 WebEngine 回调问题

java - 将对象添加到 ArrayList - 获得 n 次最后找到的对象

java - 在一定时间内执行操作 JavaFX

JavaFX 2.0 使用事件处理程序加载 fxml 文件失败