首页 > 编程语言 >仿微信聊天程序 - 09. 聊天信息

仿微信聊天程序 - 09. 聊天信息

时间:2023-07-16 17:00:17浏览次数:32  
标签:String void 09 replace content 聊天 仿微信 public

本文是仿微信聊天程序专栏的第九篇文章,主要记录了【聊天信息】的逻辑实现,下面涉及代码是《仿微信聊天程序 - 09. 聊天窗口》的基础上进行完善的。

实现效果

在《仿微信聊天程序 - 09. 聊天窗口》章节中,已经实现了基本的聊天界面框架,《09. 聊天信息》这里只是补充实现聊天内容部分功能。

界面布局

聊天内容使用的是WebView来显示,所以这里的布局就是HTML来渲染双方的聊天信息,下面一个简单对话的聊天内容布局代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="main.css">
    <script src="main.js"></script>
</head>
<body>
<div id="content">
    <!--
    <div class="message-item">
        <div class="user">
            <span class="nickname">自己的昵称</span>
            <span>时间</span>
        </div>
        <div class="content">
            这是内容
        </div>
    </div>
    <div class="message-item">
        <div class="contacts">
            <span class="nickname">好友的昵称</span>
            <span>时间</span>
        </div>
        <div class="content">
            这是内容
        </div>
    </div>
    -->
</div>
</body>
</html>

样式美化

聊天内容使用的是HTML渲染聊天内容,所以CSS就是也是HTML标准的CSS,完整的CSS代码如下:

#content {
  padding: 15px;
}
.message-item {
  padding: 5px 0;
}
.nickname {
  margin-right: 8px;
}
.user {
  color: green;
}
.contacts {
  color: blue;
}
.content {
  padding: 5px 0;
}

内容管理

聊天内容的管理使用JavaScript实现的,也就是说通过Java调用JavaScript的代码实现对聊天内容的插入和删除,下面是JavaScript实现的功能代码:

var main = {};

main.append = function (html) {
  var ele = document.createElement("div");
  ele.innerHTML = html;
  document.getElementById("content").appendChild(ele);
  window.scrollTo(0, document.body.scrollHeight);
};

main.clear = function () {
  document.getElementById("content").innerHTML = "";
};

逻辑控制

调整原来ChatMainController的代码,使用WebView引擎构建JavaScript对象,使用JavaScript对象实现对聊天内容的管理:

/**
 * @author michong
 */
public class ChatMainController implements UserDataController {
    public Label nicknameLabel;
    public WebView chatWebView;
    public TextArea messageTextArea;

    private JSObject js;
    private Long contactsId;

    @Override
    public void initialize(Object data) {
        contactsId = (Long) data;
        initializeUI();
        initializeEvent();
    }

    void initializeUI() {
        chatWebView.setContextMenuEnabled(false);
        chatWebView.setBlendMode(BlendMode.DARKEN);
        WebEngine engine = chatWebView.getEngine();
        engine.setJavaScriptEnabled(true);
        engine.getLoadWorker().stateProperty().addListener((obj, ov, nv) -> {
            if (nv == Worker.State.SUCCEEDED) {
                js = (JSObject) engine.executeScript("window.main");
                renderDebugData();
            }
        });
        engine.load(Objects.requireNonNull(getClass().getResource("/html/main.html")).toExternalForm());
    }

    void initializeEvent() {
        messageTextArea.setOnKeyPressed(e -> {
            if (e.isControlDown() && e.getCode() == KeyCode.ENTER) {
                onSendClick(null);
            }
        });
    }

    void renderDebugData() {
        nicknameLabel.setText("WxID: " + contactsId);
        MessageVO from = new MessageVO();
        from.setNickname("米虫1001");
        from.setMessage("仿微信聊天程序源码可以搜索微信小程序“Coding鱼塘”获取下载地址");
        from.setTimestamp(new Date().getTime());
        append(from, true);
    }

    void append(MessageVO vo, boolean isContacts) {
        js.call("append", Html.of(vo.getNickname(), vo.getTimestamp(), vo.getMessage(), isContacts));
    }

    public void onClearClick(ActionEvent actionEvent) {
        js.call("clear");
    }

    public void onCloseClick(ActionEvent actionEvent) {
    }

    public void onSendClick(ActionEvent actionEvent) {
        String content = messageTextArea.getText();
        if (content.trim().length() == 0) {
            return;
        }

        MessageVO from = new MessageVO();
        from.setNickname("我");
        from.setMessage(content);
        from.setTimestamp(new Date().getTime());
        append(from, false);
        messageTextArea.clear();
    }

}

内容构建

聊天内容构建工具Html:

/**
 * @author michong
 */
public class Html {

    public static String of(String nickname, long timestamp, String content, boolean isContacts) {
        String time = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date(timestamp));
        // @formatter:off
        return "<div class='message-item'>"
                + "<div class='" + (isContacts ? "user" : "contacts") + "'>"
                    + "<span class='nickname'>" + nickname + "</span>"
                    + "<span>" + time + "</span>"
                + "</div>"
                + "<div class='content'>" + escape(content) + "</div>"
             + "</div>";
        // @formatter:on
    }

    private static String escape(String content) {
        // @formatter:off
        return content.replace("&", "&amp;")
                .replace("\t", "&nbsp;&nbsp;")
                .replace("<", "&lt;")
                .replace(">", "&gt;")
                .replace(" ", "&nbsp;")
                .replace("'", "&#39;")
                .replace("\"", "&quot;")
                .replace("\r\n", "\n")
                .replace("\n", "<br>");
        // @formatter:on
    }
}

标签:String,void,09,replace,content,聊天,仿微信,public
From: https://www.cnblogs.com/michong2022/p/17558127.html

相关文章

  • day09 9.1 安卓开发项目实战二
    开发自己的第二款APP基于网络登陆注册能与后端进行交互的app【一】引入前面我们已经自己开发出了一款简答的App。但是那个App知识利用的本地的数据,没有和后端进行交互所以只能算是前端接下来我们要开发一款能与后端进行交互通信的App【二】必备知识想跟后端交互......
  • Day09(2023.07.14)
    行程8:45    到达上海市信息安全测评认证中心(黄浦区陆家浜路1308号)9:00  学习软件测评工具11:30--13:00   吃饭休息13:00  学习软件测评工具17:00      下班......
  • 仿微信聊天程序 - 01. 开篇
    本文是仿微信聊天程序专栏的第一篇文章,主要简要说明仿微信聊天程序的功能需求及架构设计。仿微信聊天程序专栏主要记录了使用JavaFX+Netty开发仿微信聊天程序---米虫IM。功能需求米虫IM已经完成的功能如下:用户注册功能用户登录功能搜索好友功能添加好友功能文本聊天......
  • 仿微信聊天程序 - 02. 注册界面
    本文是仿微信聊天程序专栏的第二篇文章,主要记录了【注册界面】的实现。界面设计仿微信聊天程序的注册界面,是一个表单,由三个输入框和一个按钮组成,具体UI展示如下图所示:界面布局页面布局使用fxml,采用VBox从上到下布局,中间的表单使用formsfx,所以只需要预留一个StackPane给表单即......
  • 仿微信聊天程序 - 03.登录界面
    本文是仿微信聊天程序专栏的第三篇文章,主要记录了【登录界面】的实现。界面设计仿微信聊天程序的登录界面跟注册界面差不多,只是比注册界面少了一个昵称输入框,如下图所示:界面布局登录界面的界面布局和注册界面的布局差不多,也是使用fxml,采用VBox从上到下布局,中间的表单使用form......
  • 仿微信聊天程序 - 04. 主界面
    本文是仿微信聊天程序专栏的第四篇文章,主要记录了【主界面】的实现。界面设计仿微信聊天程序的主界面总体跟微信的主界面差不多,但是比微信的主界面简单得多,如下图所示:界面布局主界面整个界面采用HBox布局,分为左中右三个部分,最左边是菜单栏,中间是联系人列表或对话信息列表,最右......
  • 仿微信聊天程序 - 05. 聊天列表
    本文是仿微信聊天程序专栏的第五篇文章,主要记录了【聊天列表】的界面实现。界面设计聊天列表在主界面左边,主要显示最近的聊天记录,以及添加好友的信息等,总体界面设计如下:界面布局聊天列表的布局分为两部,列表布局和列表中的每一行的布局,其中列表布局的完整fxml如下:<HBoxprefH......
  • 仿微信聊天程序 - 07. 好友信息
    本文是仿微信聊天程序专栏的第七篇文章,主要记录了【好友信息】的界面实现。界面设计这里的好友信息界面没有处理复杂的功能,仅仅显示好友信息,支持在此界面中发起聊天而已,总体的界面设计如下图所示:界面布局好友信息仅仅只是信息展示,布局相对比较简单,这里采用VBox和HBox组合使用......
  • 仿微信聊天程序 - 06. 好友列表
    本文是仿微信聊天程序专栏的第六篇文章,主要记录了【好友列表】的界面实现。界面设计好友列表在主界面左边,界面UI风格跟聊天列表类似,只不过相比聊天列表更加简单,不需要显示聊天信息,时间等,总体界面设计如下:界面布局跟好友列表一样,聊天列表的布局也分为两部,列表布局和列表中的每......
  • 仿微信聊天程序 - 08. 聊天窗口
    本文是仿微信聊天程序专栏的第八篇文章,主要记录了【聊天窗口】的界面实现。界面设计聊天窗口是整个聊天程序的核心控件,比较复杂,大致可以分为上中下三个部分,上面显示用户昵称以及一些操作菜单,中间是聊天内容显示区域,下面的信息发送的区域,总体界面设计如下:界面布局根据界面设计......