控制显示多行文本?

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

CSS控制文本超出打点显示

CSS 一段文本怎么设置超过省略号显示

如何用CSS实现多行文本的省略号显示

怎么用css实现多行文本省略?

显示textarea的多行纯文本?