我目前正在创建一个小型聊天程序(主要是为了获得一些RMI和JavaFX的经验)。聊天本身已经完成,现在我正在开发 GUI。 我希望每条聊天消息都打印在类似于此的某种文本区域中:
爱丽丝<19:21:35>:世界你好!
这些是我的问题:
- 为此使用什么 JavaFX 类?我发现一个名为 TextFlow 的类似乎能够执行我想要的操作,但我现在还不明白它到底是如何工作的。或者一个简单的 TextArea 就足够了?
- 如何在一行内使用不同的格式?使用 HTML?
- 我应该如何将收到的短信保留在客户端中?只是总是将它们附加到文本区域(并让 GUI 隐式保存它们)?或者我应该使用某种 ObservableList 来缓冲消息并且文本区域与其同步?
消息作为 Message 对象接收。这些对象基本上只存储用户名、消息和时间戳;它们每个都有一个单独的属性。
最佳答案
最简单的方法是通过 TextArea,尽管不会有任何简洁的文本格式,但它看起来就像一个平淡的记事本之类的程序。我建议使用垂直框和文本。一个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 上要好得多。
关于JavaFX:如何在某种文本区域中存储和格式化多个段落?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38598020/