【问题标题】:JavaFX: How to store and format multiple paragraphs in some kind of text area?JavaFX:如何在某种文本区域中存储和格式化多个段落?
【发布时间】:2016-07-26 19:07:33
【问题描述】:
我目前正在创建一个小型聊天程序(主要是为了获得一些 RMI 和 JavaFX 经验)。聊天本身已经完成,现在我正在处理 GUI。
我希望每条聊天消息都打印在类似于此的某种文本区域中:
爱丽丝:世界你好!
这些是我的问题/疑问:
- 为此使用什么 JavaFX 类?我发现了一个名为 TextFlow 的类,它似乎能够做我想做的事,但我现在还不明白它是如何工作的。还是一个简单的 TextArea 就足够了?
- 如何在一行中使用不同的格式?使用 HTML?
- 我应该如何将收到的短信保存在客户端中?只是总是将它们附加到文本区域(并让它们由 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】:
如果您的格式要求是固定的,那么 Text 和 TextFlow 将是一个很好的起点。每个文本节点都可以通过代码或 CSS 指定样式。将多个文本节点放在一个 TextFlow 中。将 TextFlow 节点放入布局容器中。从 VBox 开始进行测试,但我建议在基本工作正常后使用 TableView。 TextFlow 的 javadoc 包含示例代码的 sn-ps,应该可以帮助您进行操作。
对于纯 JavaFX 解决方案,请使用多个 Text 节点,并使用 CSS 设置样式。在每个节点上设置格式属性,或指定样式并使用外部 .css 文件。或者,如果您想考虑第三方组件,那么像这样:https://github.com/TomasMikula/RichTextFX 可能是一个不错的起点。
您肯定希望将数据模型与显示模型(或视图,如果您想使用该术语)分开。构建一个数据类(例如,消息)。如果您将消息数据保存在消息对象的 ObservableList 中,则可以将其绑定到 TableView,并在您添加或删除列表中的条目时自动更新表格。向表格单元格工厂添加代码,以控制如何从数据模型中呈现每个单元格(例如,通过创建 TextFlow 来绘制内容)。