如何在 JavaFX 中包装文本
How to wrap a Text in JavaFX
我正在尝试创建一个简单的 JavaFX 应用程序,其中以编程方式将文本添加到位于滚动窗格中的 VBox(这样,当文本太多时,可以滚动 window 以查看其他部分整体)。
我的问题是我的文本没有换行:它们只是从 window 一行出来。
使用前面的 Whosebug 答案,我连续尝试了:
- 停用我的滚动窗格的水平滚动,
- 设置 ScrollPane 为 fitToWidth="true"
- 将我的文本宽度属性绑定到其中一个封闭布局的宽度属性
- 将我的文本 widthProperty 绑定到场景本身的宽度属性(我想避免这种情况,因为我需要在我的控制器的 Initialize() 方法中设置第一个,当场景尚不可用时,它没有无论如何都无法工作)。
None 这些有什么不同(除了水平滚动条的消失,这是没有意义的,因为你无论如何都可以通过平移来滚动)。
这是我的 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));
它所做的只是停用水平滚动,但文本仍然没有换行:所以现在它们超出 window 并且无法完整地看到。
Edit2:我也试过了:
text.setWrappingWidth(mainBox.widthProperty().intValue() - 10);
也没有用:文本根本不会换行。
Edit3:我尝试了这个简单的实验:
text.setWrappingWidth(150);
System.out.println("wrapping width:" + text.getWrappingWidth());
wrapping width:150 被输出但是文本没有换行...现在我很困惑。
好吧,回答我自己的问题,我发现正常的过程是将文本包装在一个 TextFlow 对象中。这样做,文本会很好地环绕。
我不明白的是,为什么在文档中绝对没有任何地方写到如果文本位于 ScrollPane 的 *Box 中,即使您正确设置了它们的换行宽度,它们也不会换行。
也就是说它现在可以工作了,文本被添加到 TextFlow 而不是直接添加到 Box 中,大家都很高兴。
我正在尝试创建一个简单的 JavaFX 应用程序,其中以编程方式将文本添加到位于滚动窗格中的 VBox(这样,当文本太多时,可以滚动 window 以查看其他部分整体)。
我的问题是我的文本没有换行:它们只是从 window 一行出来。
使用前面的 Whosebug 答案,我连续尝试了:
- 停用我的滚动窗格的水平滚动,
- 设置 ScrollPane 为 fitToWidth="true"
- 将我的文本宽度属性绑定到其中一个封闭布局的宽度属性
- 将我的文本 widthProperty 绑定到场景本身的宽度属性(我想避免这种情况,因为我需要在我的控制器的 Initialize() 方法中设置第一个,当场景尚不可用时,它没有无论如何都无法工作)。
None 这些有什么不同(除了水平滚动条的消失,这是没有意义的,因为你无论如何都可以通过平移来滚动)。
这是我的 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));
它所做的只是停用水平滚动,但文本仍然没有换行:所以现在它们超出 window 并且无法完整地看到。
Edit2:我也试过了:
text.setWrappingWidth(mainBox.widthProperty().intValue() - 10);
也没有用:文本根本不会换行。
Edit3:我尝试了这个简单的实验:
text.setWrappingWidth(150);
System.out.println("wrapping width:" + text.getWrappingWidth());
wrapping width:150 被输出但是文本没有换行...现在我很困惑。
好吧,回答我自己的问题,我发现正常的过程是将文本包装在一个 TextFlow 对象中。这样做,文本会很好地环绕。
我不明白的是,为什么在文档中绝对没有任何地方写到如果文本位于 ScrollPane 的 *Box 中,即使您正确设置了它们的换行宽度,它们也不会换行。
也就是说它现在可以工作了,文本被添加到 TextFlow 而不是直接添加到 Box 中,大家都很高兴。