用于显示多行文本的控件?

Control for displaying multiline text?

提问人:stefan.at.kotlin 提问时间:4/13/2013 最后编辑:Seyit Bilalstefan.at.kotlin 更新时间:11/6/2019 访问量:93514

问:

我需要显示多行只读文本 - 哪个控件可用于此目的?它应该只显示文本,就像 Label 一样,但是 Label 不支持多行?

感谢您的任何提示:-)

控件 JavaFX-2

评论

1赞 OttPrime 4/13/2013
您是否查看了 TextArea 控件?您可以将其设置为不可编辑,并将其样式设置为看起来像标签。
0赞 stefan.at.kotlin 4/13/2013
谢谢 OttPrime,是的,这就是我目前遵循的想法。我仍然想知道是否没有显示文本的真正控制?类似于 .NET 中的 RichTextBox?
0赞 OttPrime 4/13/2013
HTMLEditor 是最接近 RichTextBox 的工具,但它的功能可能比您想要的要多一些。

答:

83赞 jewelsea 4/13/2013 #1

您可以在标签中显示多行只读文本。

如果文本中包含(换行符)字符,则无论换行符所在的位置,标签都将换行到新行。\n

如果标签的 wrapText 设置为 true,并且没有足够的空间来显示单行文本,则标签会将文本换行为新行。


如果需要不同样式的文本,那么,如果使用 JavaFX 2,请在 FlowPane 中放置多个标签,或者,如果您使用的是 Java 8+,则将标签放在 TextFlow 组件中。


lovemenot

由以下代码生成:

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");
}

尝试运行上述程序并调整窗口大小,以查看标签文本中新行值的效果以及标签上的属性。将设置从 true 更改为 false,以查看打开和关闭之间的区别。\nwrapTextwrapTextwrapText

评论

31赞 randers 1/3/2016
哦,天哪,Comic Sans MS 太糟糕了。
11赞 jewelsea 1/5/2016
哈哈,真的是安德斯,鲍勃Microsoft某个地方拥抱我,字体设计师在诅咒我:-)
1赞 Neuron 7/12/2017
关于您的示例图像的一切都让我不寒而栗
1赞 Neil Benn 8/17/2017
这为我赢得了支持,因为它是为数不多的让我发笑的回应之一:D
1赞 jewelsea 1/30/2021
@golimar 如果没有足够的布局空间来显示全文,则将省略标签文本。您的问题在于您在布局窗格及其内容上设置的约束。如果问题仍然存在。创建一个新问题,其中包含一个最小的可重复示例。在您的新问题中,您可以参考此答案。
1赞 SystemsInCode 4/25/2016 #2

还提供文本类。在这个答案中有一个很好的解释 label-and-text-differences-in-javafx 基本上将 Text 用于您没有输入的地方,否则 Label 更好。

10赞 Issam El omri 7/28/2016 #3

如果为 设置所需的最大宽度,则设置为显示文本多行:LabelsetWrapTexttrue

Label label = new Label("Your long text here");
label.setMaxWidth(180);
label.setWrapText(true);
6赞 Steel Rat 1/31/2017 #4

如果文本中包含 \n(换行符)字符,则标签将换行到换行符所在的新行。

当您从 FXML 文件以及可视化 FXML 编辑器设置文本时,它不起作用。

评论

9赞 User 4/15/2017
由于它是“XML”,因此您必须在 FXML 中使用它:
不确定 Scene Builder 是否允许您执行此操作,可能需要直接编辑 FXML。
0赞 jpllosa 5/17/2017
@Manius 在哪里可以找到 ?尝试谷歌搜索,但找不到任何列表。谢谢。
FXML escape codes
0赞 User 5/21/2017
这些数字只是 ASCII 值!asciitable.com(13 = 返回):)此外,对于某些控件(我忘记了哪个,有点超出了 Ballmer Peak atm),Scene Builder 有一个“多线模式”,如果你仔细观察,你可以在 UI 中启用它。
9赞 guru_001 4/21/2017 #5

您还可以根据需要设置 wrappingWidthProperty 来使用 Text 以多行形式显示。

Text text = new Text();
text.wrappingWidthProperty().set(345);

在这段代码中,我把最大宽度设置为,所以当文本的大小超过像素时,就会被换行到下一行。345.0345