当前位置: 首页 > news >正文

25.4.22学习总结

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

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

一、改造数据结构

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

1.Map存ObservableList<TextMessage>

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

private Map<String,ObservableList<TextMessage>>chatHistoryMap=new HashMap<>();

2.当前选中的聊天

//删除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.修改聊天会话

// 删除 private ObservableList<TextMessage> messages;
private ObservableList<messageListMessage> chatSessions = FXCollections.observableArrayList(); 

二、初始化聊天会话 

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

 1.绑定聊天会话列表

// 绑定聊天会话列表messageList.setItems(chatSessions);

 2.初始化聊天记录存储

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

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

// 设置默认选中第一个会话messageList.getSelectionModel().selectFirst();

三、实现会话选择监听

// 在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());}
});
  1. 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 表达式,定义了监听器的回调函数。

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

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

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

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

  2. if (newVal != null) { ... }
    • 这是一个条件判断,确保 newVal (也就是当前选中的好友) 不为 null。 也就是说只有在真正选中了一个好友时,才会执行后面的代码。如果用户取消了选择,newVal 就会是 null,此时不应该执行后续的操作。

  3. selectedChat.set(newVal);
    • selectedChat: 你之前定义的 SimpleObjectProperty<messageListMessage> selectedChat,用于存储当前选中的好友对象。

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

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

  4. 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. chatList.setItems(history);
    • chatList: 你的聊天消息 ListView,用于显示聊天记录。

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

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

  6. 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. chatMemberText.setText(newVal.getName());
    • chatMemberText: 你的聊天窗口标题,通常是一个 Label 组件。

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

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

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

四、改造消息发送功能 

@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();
}

http://www.xdnf.cn/news/81505.html

相关文章:

  • IOT项目——双轴追光系统
  • # 利用迁移学习优化食物分类模型:基于ResNet18的实践
  • 第十一届机械工程、材料和自动化技术国际会议(MMEAT 2025)
  • 机器人进阶---视觉算法(六)傅里叶变换在图像处理中怎么用
  • hi3516cv610构建音频sample工程代码步骤
  • Spring Boot Actuator 详细使用说明(完整代码与配置)
  • 【C++游戏引擎开发】第21篇:基于物理渲染(PBR)——统计学解构材质与光影
  • 基于华为云 ModelArts 的在线服务应用开发(Requests 模块)
  • 数字IC低功耗设计——基础概念和低功耗设计方法
  • 【Linux】用户权限
  • LangChain 核心模块学习:Chains
  • USB 共享神器 VirtualHere 局域网内远程使用打印机与扫描仪
  • 安宝特科技 | Vuzix Z100智能眼镜+AugmentOS:重新定义AI可穿戴设备的未来——从操作系统到硬件生态,如何掀起无感智能革命?
  • 麒麟系统网络连接问题排查
  • 乐视系列玩机------乐视2 x620红灯 黑砖刷写教程以及新版刷写工具的详细释义
  • C++IO流
  • AI 数字短视频数字人源码开发:多维赋能短视频生态革新​
  • 图像预处理-直方图均衡化
  • 卷积神经网络迁移学习:原理与实践指南
  • GSAP 动画引擎实战:打造丝滑动效交互组件库
  • 在 40 亿整数中捕获“恰好出现两次”的数字
  • Git管理
  • 离散化区间和 java c++
  • Springboot整合MyBatisplus和快速入门
  • lspci的资料
  • crewai与langchain分析某公司股票是否可购买
  • prtobuf的原理
  • 2.Spring MVC与WebFlux响应式编程
  • UOS+N 卡 + CUDA 环境下 X86 架构 DeepSeek 基于 vLLM 部署与 Dify 平台搭建指南
  • Nature Communications 面向形状可编程磁性软材料的数据驱动设计方法—基于随机设计探索与神经网络的协同优化框架