【问题标题】:JavaFX: How to store and format multiple paragraphs in some kind of text area?JavaFX:如何在某种文本区域中存储和格式化多个段落?
【发布时间】:2016-07-26 19:07:33
【问题描述】:

我目前正在创建一个小型聊天程序(主要是为了获得一些 RMI 和 JavaFX 经验)。聊天本身已经完成,现在我正在处理 GUI。 我希望每条聊天消息都打印在类似于此的某种文本区域中:

爱丽丝:世界你好!

这些是我的问题/疑问:

  1. 为此使用什么 JavaFX 类?我发现了一个名为 TextFlow 的类,它似乎能够做我想做的事,但我现在还不明白它是如何工作的。还是一个简单的 TextArea 就足够了?
  2. 如何在一行中使用不同的格式?使用 HTML?
  3. 我应该如何将收到的短信保存在客户端中?只是总是将它们附加到文本区域(并让它们由 GUI 隐式保存)?或者我应该使用某种 ObservableList 来缓冲消息并且文本区域与之同步?

消息作为消息对象接收。这些对象基本上只是存储用户名、消息和时间戳;他们每个人都在一个单独的属性中。

【问题讨论】:

    标签: java javafx formatting chat


    【解决方案1】:

    最简单的方法是通过 TextArea,虽然没有任何整洁的文本格式,但它看起来就像一个平淡无奇的 NotePad 程序。我建议使用 VBox 和文本。一个 VBox 可以用来存储所有的文本,你可以把 VBox 放在一个 ScrollPane 中进行滚动。然后,对于每条消息,放置一个由 3 个文本组成的 HBox。这是一个例子

    //Put this method in your Application class
    public static void addMessage(Message message){
        Text username = new Text(message.getUsername());
        username.setFont(Font.font("Verdana", FontWeight.BOLD, 14));
        Text date = new Text(message.getTimestamp());
        date.setFont(Font.font("Verdana", FontWeight.ITALIC, 12));
        date.setFill(Color.GRAY);
        Text message = new Text(message.getMessage());
        date.setFont(Font.font("Courier New", 12));
        mainBox.getChildren().Add(new HBox(username, date, message)); //mainBox being a VBox that stores all your HBoxes. 
    }
    

    显然,请根据您的需要进行更改,并更改样式。我只是举了一个例子。这是我以前做过的,加上正确的样式,它看起来比仅仅在 TextArea 上泼水好多了。

    【讨论】:

    • 这听起来很有趣,谢谢。有时间我会试试的。
    【解决方案2】:
    1. 如果您的格式要求是固定的,那么 Text 和 TextFlow 将是一个很好的起点。每个文本节点都可以通过代码或 CSS 指定样式。将多个文本节点放在一个 TextFlow 中。将 TextFlow 节点放入布局容器中。从 VBox 开始进行测试,但我建议在基本工作正常后使用 TableView。 TextFlow 的 javadoc 包含示例代码的 sn-ps,应该可以帮助您进行操作。

    2. 对于纯 JavaFX 解决方案,请使用多个 Text 节点,并使用 CSS 设置样式。在每个节点上设置格式属性,或指定样式并使用外部 .css 文件。或者,如果您想考虑第三方组件,那么像这样:https://github.com/TomasMikula/RichTextFX 可能是一个不错的起点。

    3. 您肯定希望将数据模型与显示模型(或视图,如果您想使用该术语)分开。构建一个数据类(例如,消息)。如果您将消息数据保存在消息对象的 ObservableList 中,则可以将其绑定到 TableView,并在您添加或删除列表中的条目时自动更新表格。向表格单元格工厂添加代码,以控制如何从数据模型中呈现每个单元格(例如,通过创建 TextFlow 来绘制内容)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 2017-05-01
      相关资源
      最近更新 更多