25.4.22学习总结

如何通过好友列表对聊天框的切换

首先,我们知道,你的好友列表是用ListView组件实现的,那么,接下来,我们将开始讲解如何实现切换。

一、改造数据结构

如果你是跟着我的上一篇文章做的话,应该需要修改一些的。如果不是,请了解上一篇用的再添加之后讲的。

1.Map存ObservableList<TextMessage>

你的每一项好友都对应着一个ObservableList<TextMessage>,你可以ObservableList<TextMessage>理解为消息数组,这是你的UI界面的数据源。

java 复制代码
private Map<String,ObservableList<TextMessage>>chatHistoryMap=new HashMap<>();

2.当前选中的聊天

java 复制代码
//删除private ObservableList<>messages1;
private SimpleObjectProperty<messageListMessage> selectedChat = new SimpleObjectProperty<>();
  1. SimpleObjectProperty<messageListMessage>:

    • 这是一个 JavaFX 属性类,专门用于存储一个 Object 类型的引用。 在这个例子中,它存储的是 messageListMessage 类型的对象。

    • JavaFX 属性 (Properties): JavaFX 属性是 JavaFX 框架的核心概念之一,用于实现数据绑定和自动 UI 更新。 它们是包装了普通 Java 字段的特殊类,并添加了以下功能:

      • 可观察性 (Observability): 当属性的值发生变化时,可以通知监听器 (Listeners)。

      • 绑定 (Binding): 可以将一个属性绑定到另一个属性,这样当一个属性的值发生变化时,另一个属性的值也会自动更新。

    • SimpleObjectProperty : 是 ObjectProperty 接口的一个具体实现类。 它提供了一个简单的方式来创建和管理一个 Object 类型的 JavaFX 属性。

    • <messageListMessage> : 这是一个 泛型类型参数 ,指定了 SimpleObjectProperty 将存储的对象的类型。 在这里,它表示 selectedChat 属性将存储 messageListMessage 类型的对象。 messageListMessage 应该是你自定义的一个类,表示聊天消息的信息。

3.修改聊天会话

java 复制代码
// 删除 private ObservableList<TextMessage> messages;
private ObservableList<messageListMessage> chatSessions = FXCollections.observableArrayList(); 

二、初始化聊天会话

在initialize()方法中添加以下代码:

1.绑定聊天会话列表

java 复制代码
// 绑定聊天会话列表
    messageList.setItems(chatSessions);

2.初始化聊天记录存储

java 复制代码
// 初始化聊天记录存储
    for (messageListMessage chat : chatSessions) {
        chatHistoryMap.put(chat.getUid(), FXCollections.observableArrayList());
    }

3.设置默认选中第一个会话(选做)

java 复制代码
// 设置默认选中第一个会话
    messageList.getSelectionModel().selectFirst();

三、实现会话选择监听

java 复制代码
// 在initialize()方法中添加:
messageList.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> {
    if (newVal != null) {
        // 更新当前选中会话
        selectedChat.set(newVal);
        // 切换聊天记录
        ObservableList<TextMessage> history = chatHistoryMap.get(newVal.getUid());
        chatList.setItems(history);
        // 自动滚动到底部
        if (!history.isEmpty()) {
            chatList.scrollTo(history.size() - 1);
        }
        // 更新聊天窗口标题
        chatMemberText.setText(newVal.getName());
    }
});
java 复制代码
messageList.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> { ... });
  • messageList.getSelectionModel() : 获取 messageList (你的好友列表 ListView) 的选择模型 (SelectionModel)。 选择模型负责管理 ListView 中的选中项。

  • .selectedItemProperty() : 获取当前选中项的属性 (Property)。 这是一个 ObjectProperty<messageListMessage>,其中 messageListMessage 是你自定义的类,代表一个好友。

  • .addListener((obs, oldVal, newVal) -> { ... }): 为这个属性添加一个监听器 (Listener)。 监听器会在属性的值发生变化时被调用。

    • (obs, oldVal, newVal) -> { ... }: 这是一个 lambda 表达式,定义了监听器的回调函数。

      • obs : ObservableValue 对象,代表被监听的属性 (也就是 selectedItemProperty)。

      • oldVal : 上一个选中的 messageListMessage 对象 (在选中项变化之前的值)。

      • newVal : 当前选中的 messageListMessage 对象 (也就是新的选中项)。

总的来说,这行代码的作用是:当 messageList (好友列表) 中选中的好友发生变化时,执行 lambda 表达式中的代码。
2.

java 复制代码
if (newVal != null) { ... }
  • 这是一个条件判断,确保 newVal (也就是当前选中的好友) 不为 null。 也就是说只有在真正选中了一个好友时,才会执行后面的代码。如果用户取消了选择,newVal 就会是 null,此时不应该执行后续的操作。
java 复制代码
selectedChat.set(newVal);
  • selectedChat : 你之前定义的 SimpleObjectProperty<messageListMessage> selectedChat,用于存储当前选中的好友对象。

  • .set(newVal) : 将 selectedChat 属性的值设置为 newVal (也就是当前选中的好友对象)。 这会更新 selectedChat 的值,并通知所有监听 selectedChat 属性的监听器。

这行代码的作用是:更新 selectedChat 属性,使其指向当前选中的好友。
4.

java 复制代码
ObservableList<TextMessage> history = chatHistoryMap.get(newVal.getUid());
  • chatHistoryMap : 你需要定义一个 Map<String, ObservableList<TextMessage>> chatHistoryMap,用于存储每个好友的聊天记录。 其中,Key 是好友的 Uid (唯一 ID),Value 是该好友的聊天记录列表 ( ObservableList<TextMessage> )。

  • newVal.getUid() : 获取当前选中的好友的 Uid (假设你的 messageListMessage 类中有一个 getUid() 方法来获取好友的 Uid)。 这个 Uid 用于从 chatHistoryMap 中查找对应的聊天记录。

  • chatHistoryMap.get(newVal.getUid()) : 从 chatHistoryMap 中根据好友的 Uid 获取该好友的聊天记录列表。 如果 chatHistoryMap 中不存在该好友的聊天记录,则返回 null

  • ObservableList<TextMessage> history : 将获取到的聊天记录列表赋值给 history 变量。 history 的类型是 ObservableList<TextMessage>,表示这是一个可观察的聊天消息列表。

这行代码的作用是:从 chatHistoryMap 中获取当前选中的好友的聊天记录列表,并将其存储在 history 变量中。
5.

java 复制代码
chatList.setItems(history);
  • chatList : 你的聊天消息 ListView,用于显示聊天记录。

  • .setItems(history) : 将 chatList 的数据源设置为 history (也就是当前选中好友的聊天记录列表)。 这会将聊天消息显示在 chatList 中。

这行代码的作用是:将聊天消息 ListView 的数据源设置为当前选中好友的聊天记录列表,从而更新聊天界面。
6.

java 复制代码
if (!history.isEmpty()) { chatList.scrollTo(history.size() - 1); }
  • history.isEmpty() : 判断 history (也就是当前选中好友的聊天记录列表) 是否为空。

  • !history.isEmpty() : 如果 history 不为空 (也就是当前选中好友有聊天记录),则执行 chatList.scrollTo(history.size() - 1)

  • chatList.scrollTo(history.size() - 1) : 将 chatList 滚动到最后一条消息 (也就是聊天记录列表的最后一个元素)。 这样可以确保用户在切换聊天对象时,总是看到最新的聊天记录。

这行代码的作用是:如果当前选中好友有聊天记录,则将聊天消息 ListView 滚动到最后一条消息。
7.

java 复制代码
chatMemberText.setText(newVal.getName());
  • chatMemberText : 你的聊天窗口标题,通常是一个 Label 组件。

  • newVal.getName() : 获取当前选中的好友的姓名 (假设你的 messageListMessage 类中有一个 getName() 方法来获取好友的姓名)。

  • .setText(newVal.getName()) : 将 chatMemberText 的文本设置为当前选中好友的姓名。 这样可以在聊天窗口的标题栏显示当前正在聊天的对象。

这行代码的作用是:更新聊天窗口的标题,显示当前正在聊天的对象的姓名。

四、改造消息发送功能

java 复制代码
@FXML 
public void sendingClick(){
    messageListMessage currentChat = selectedChat.get();
    if (currentChat == null || InputArea.getText().trim().isEmpty()) return;

    // 创建消息对象(根据你的实际逻辑调整参数)
    TextMessage newMessage = new TextMessage(......);

    // 添加到对应的聊天记录
    chatHistoryMap.get(currentChat.getUid()).add(newMessage);
    
    InputArea.clear();
}
相关推荐
时光追逐者27 分钟前
MongoDB从入门到实战之MongoDB快速入门(附带学习路线图)
数据库·学习·mongodb
一弓虽32 分钟前
SpringBoot 学习
java·spring boot·后端·学习
genggeng不会代码2 小时前
用于协同显著目标检测的小组协作学习 2021 GCoNet(总结)
学习
搞机小能手2 小时前
六个能够白嫖学习资料的网站
笔记·学习·分类
冰茶_5 小时前
.NET MAUI 发展历程:从 Xamarin 到现代跨平台应用开发框架
学习·microsoft·微软·c#·.net·xamarin
帅云毅6 小时前
Web3.0的认知补充(去中心化)
笔记·学习·web3·去中心化·区块链
豆豆6 小时前
day32 学习笔记
图像处理·笔记·opencv·学习·计算机视觉
nenchoumi31196 小时前
VLA 论文精读(十六)FP3: A 3D Foundation Policy for Robotic Manipulation
论文阅读·人工智能·笔记·学习·vln
凉、介6 小时前
PCI 总线学习笔记(五)
android·linux·笔记·学习·pcie·pci