控制显示多行文本?
Posted
技术标签:
【中文标题】控制显示多行文本?【英文标题】:Control for displaying multiline text? 【发布时间】:2013-04-05 07:56:52 【问题描述】:我需要显示多行只读文本 - 可以使用哪个控件?它应该只显示文本,就像标签一样,但是标签不支持多行?
感谢任何提示:-)
【问题讨论】:
您查看TextArea 控件了吗?您可以将其设为不可编辑并将其设置为看起来像一个标签。 谢谢 OttPrime,是的,这就是我目前正在遵循的想法。我仍然想知道是否没有真正的控制来显示文本? .NET 中的 RichTextBox 之类的东西? htmlEditor 是最接近 RichTextBox 的,但它的功能可能比你想要的要多。 【参考方案1】:您可以在Label
中显示多行只读文本。
如果文本中包含\n
(换行符)字符,则无论换行符在哪里,标签都会换行。
如果标签将wrapText
设置为true,并且没有足够的空间来显示单行文本,那么标签会将文本换行。
如果您想要不同样式的文本,那么,如果使用 JavaFX 2,请将多个标签放在 FlowPane
中,或者,如果您使用 Java 8+,请将标签放在 TextFlow
组件中。
由以下代码产生:
import javafx.scene.Scene;
import javafx.application.Application;
import javafx.scene.control.Label;
import javafx.scene.image.*;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class LoveMeNot extends Application
public static void main(String[] args) throws Exception launch(args);
@Override public void start(final Stage stage) throws Exception
Label label = new Label(WORDS);
label.setWrapText(true);
label.setStyle("-fx-font-family: \"Comic Sans MS\"; -fx-font-size: 20; -fx-text-fill: darkred;");
ImageView image = new ImageView(IMAGE);
image.setOpacity(0.3);
StackPane layout = new StackPane();
layout.setStyle("-fx-background-color: mistyrose; -fx-padding: 10;");
layout.getChildren().setAll(image, label);
stage.setTitle("Love Me Not");
stage.setScene(new Scene(layout));
stage.show();
// creates a triangle.
private static final String WORDS =
"Love not me for comely grace,\n" +
"For my pleasing eye or face,\n" +
"Nor for any outward part,\n" +
"No, nor for my constant heart,\n" +
"For these may fail, or turn to ill.\n" +
"So thou and I must sever.\n" +
"Keep therefore a true woman’s eye,\n" +
"And love me still, but know not why,\n" +
"So hast thou the same reason still\n" +
"To doat upon me ever.";
private static final Image IMAGE =
new Image("http://icons.iconarchive.com/icons/artdesigner/gentle-romantic/256/rose-icon.png");
尝试运行上述程序并调整窗口大小以查看标签文本中\n
新行值以及标签上wrapText
属性的效果。将 wrapText
设置从 true 更改为 false,以查看打开和关闭 wrapText
之间的区别。
【讨论】:
天哪,Comic Sans MS 太糟糕了。 大声笑,真正的 rAnders,微软 Bob 在某个地方拥抱我,而字体设计师在诅咒我 :-) 关于你的示例图片的一切都让我不寒而栗 这得到了我的支持,因为它是少数几个让我发笑的回答之一:D @golimar 如果没有足够的布局空间来显示全文,标签文本将被省略。您的问题在于您在布局窗格上设置的约束及其内容。如果您继续遇到问题。创建一个包含minimal reproducible example 的新问题。在您的新问题中,您可以参考此答案。【参考方案2】:如果您为Label
设置了所需的最大宽度,则将setWrapText
设置为true
,这样它就会显示多行文本:
Label label = new Label("Your long text here");
label.setMaxWidth(180);
label.setWrapText(true);
【讨论】:
【参考方案3】:你也可以使用Text
出现在多行中,根据你的需要设置wrappingWidthProperty
。
Text text = new Text();
text.wrappingWidthProperty().set(345);
在这段代码中,我将最大宽度设置为345.0
,所以当文本的大小超过345
时,像素将被换行到下一行。
【讨论】:
【参考方案4】:如果文本中有\n(换行符)字符,则标签将在换行符所在的位置换行。
当您从 FXML 文件以及可视 FXML 编辑器设置文本时,它不起作用。
【讨论】:
因为它是“XML”,你必须在 FXML 中使用它:不确定 Scene Builder 是否允许您这样做,可能需要直接编辑 FXML。 @Manius 我在哪里可以找到
的列表?尝试谷歌搜索FXML escape codes
,但找不到任何列表。谢谢。
数字只是 ASCII 值! asciitable.com (13 = return) :) 此外,对于某些控件(我忘记了,有点超过 Ballmer Peak atm)Scene Builder 有一个“多行模式”,如果你仔细观察,你可以在 UI 中启用它。
【参考方案5】:
文本类也可用。这个答案中有一个很好的解释label-and-text-differences-in-javafx 基本上在你没有得到输入的地方使用文本,否则标签更好。
【讨论】:
以上是关于控制显示多行文本?的主要内容,如果未能解决你的问题,请参考以下文章
多行文本省略号样式丢失,以及控制台显示autoprefixer警告'Autoprefixer applies control comment to whole block, not to ne