如何在JavaFX中包装文本

时间:2019-05-30 15:39:03

标签: java javafx javafx-8 fxml

我正在尝试创建一个简单的JavaFX应用程序,其中以编程方式将文本添加到位于Scrollpane中的VBox中(这样,当文本过多时,可以滚动窗口以查看整体的其他部分)。 / p>

我的问题是我的文本没有自动换行:它们只是从窗口中出来一行。

使用前面的StackOverflow答案,我先后尝试过:

  • 停用滚动面板的水平滚动,
  • 使用fitToWidth =“ true”设置ScrollPane
  • 将我的文本的widthProperty绑定到其中一种布局的布局
  • 将我的文本的widthProperty绑定到场景本身的宽度(我想避免这种情况,因为我需要在控制器的Initialize()方法中设置第一个,当场景不可用时,它没有无论如何都可以。)

这些都不起作用(除了水平滚动条的消失,这毫无意义,因为您仍然可以通过平移来滚动)。

这是我的fxml:

<BorderPane fx:controller="org.duckdns.spacedock.lifepathfx.PathController" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
<center>
<ScrollPane hbarPolicy="NEVER" pannable="true" fitToWidth="true" fx:id="scrollPane" >
    <content>
    <VBox fx:id="mainBox" >

    </VBox>
    </content>
</ScrollPane>
</center>
<top>
<ToolBar>
    <items>
    <Button mnemonicParsing="false" text="Back" onAction="#rollback" />
    </items>
</ToolBar>
</top>

这是我添加文本的代码:

private void displayNewParagraph()
{
Text text = new Text(someFunctionReturningAString());
text.wrappingWidthProperty().bind(mainBox.widthProperty().subtract(15));
mainBox.getChildren().add(text);
} 

注意:我正在使用全屏界面,因为我希望我的应用在每个屏幕尺寸上都以相同的方式显示。这就是为什么我没有为文本使用固定宽度的原因。

编辑:我尝试了另一件事:将ScrollPane和VBox宽度属性绑定到:

mainBox.maxWidthProperty().bind(scrollPane.widthProperty().subtract(10).subtract(10));
mainBox.minWidthProperty().bind(scrollPane.widthProperty().subtract(10).subtract(10));

它所做的只是取消了水平滚动,但是文本仍然没有包装:所以现在它们离开了窗口,无法完全看到。

Edit2:我也尝试过:

text.setWrappingWidth(mainBox.widthProperty().intValue() - 10);

也不起作用:文本根本不会换行。

Edit3:我尝试了这个简单的实验:

text.setWrappingWidth(150);
System.out.println("wrapping width:" + text.getWrappingWidth());

包裹宽度:150,但文本没有包裹...现在我很困惑。

1 个答案:

答案 0 :(得分:0)

好的,回答了我自己的问题,我发现正常的过程是将Texts包装在TextFlow对象中。这样做,文本会很好地包裹起来。

我不明白的是,为什么在文档中绝对没有写明即使将ScrollWane的* Box设置为正确的文本也不会包装在ScrollPane中的文本。

说现在正在工作,正在将文本直接添加到TextFlow中,而不是直接添加到Box中,每个人都很高兴。