首页 文章

JavaFX:如何在某种文本区域中存储和格式化多个段落?

提问于
浏览
0

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

Alice <19:21:35>: Hello World!

这些是我的问题/问题:

  • 用于此的JavaFX类是什么?我发现了一个名为TextFlow的类似乎能够做我想要的,但我现在还不明白它究竟是如何工作的 . 或者是一个简单的TextArea吗?

  • 如何在一行中使用不同的格式?使用HTML?

  • 如何将收到的短信保留在客户端内?只需将它们附加到文本区域(并通过GUI隐式保存)?或者我应该使用某种缓冲消息的ObservableList并且文本区域与它同步?

消息作为消息对象接收 . 这些对象基本上只存储用户名,消息和时间戳;每个属于一个单独的属性 .

2 回答

  • 0

    最简单的方法是通过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上更好 .

  • 1
    • 如果您的格式要求得到修复,那么Text和TextFlow将是一个很好的起点 . 可以在代码中或通过CSS为每个文本节点分配样式 . 将多个文本节点放在一起放入TextFlow . 将TextFlow节点放入布局容器中 . 从VBox开始进行测试,但是一旦你掌握了基础知识,我建议你使用TableView . TextFlow的javadoc包含示例代码片段,可以帮助您 .

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

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

相关问题