【多线程编程】模拟QQ的“正在输入...”,输入状态检测原理

如果留意的话,你会发现新版本的QQ、微信、易信都增加了一个输入状态检测的新功能,来提醒你聊天的对方当前是否正在编辑信息。这次在从西安回来的路上,我一直在思考这个东西的原理,到实验室后赶紧做了一些实验,也达到了类似的效果。下图是我QQ上的效果图。


那么它的原理是什么呢?

首先要用到多线程,即需要一个线程去不断检测文本输入框的字符串长度,当输入字符长度在变化时就认为有操作,即“正在输入”。那这就简单了,此时自己的QQ客户端只需将一个boolean型的值通过网络,如http或socket等方式后台传给对方QQ客户端,则对方QQ就会提醒你“正在输入...”。

原理想通后就动手做吧,下面是我写的一段程序,注释比较详细,不多赘述。先来看下运行结果。

注:连续输入c216 linux,则一直提示“正在输入...”。

注:输入结束后,或中间停止输入,则不再提示。

目前,检查间隔sleep设为500ms,正常速度输入时,效果较好。可以自己体验哦!下面是完整代码。

package XiaoMi;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;

public class test27 extends Frame {

	/**
	 * @param args
	 */
	MyTextField myTextField = new MyTextField();

	public test27(String title) {
		super(title);
		Panel disp = new Panel();
		disp.setLayout(new FlowLayout()); //设置布局类型
		disp.add(myTextField);
		new Thread(myTextField).start(); //开启输入检测线程
		add("West", disp);
		
		Label info = new Label(""); //添加提示标签控件
		add("Center", info);
		
		Button control = new Button("发送"); //添加按钮控件
		add("South", control);
		
		pack(); //调整窗口的大小
		setVisible(true); //设置可见性
		
		while (true) { //循环检测输入并提示
			if (myTextField.isInputing)
				info.setText("正在输入...");
			else
				info.setText("");
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new test27("模拟QQ检测输入程序");
	}

}

// 定义具有输入检测功能的TextField
class MyTextField extends TextField implements Runnable {

	boolean isInputing = false; //是否正在输入

	public MyTextField() {
		super(""); //文本框默认显示值
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			
			int strLengthBefore = this.getText().length(); //获取休眠前输入字符串长度
			try {
				Thread.sleep(500); //调节检测的周期,即灵敏度
			} catch (InterruptedException e) {
			}
			int strLengthAfter = this.getText().length(); //获取休眠后输入字符串长度
			if (strLengthAfter != strLengthBefore)
				isInputing = true;
			else
				isInputing = false;
			// System.out.println("当前字符长度: " + strLengthAfter); //后台输出
			if (isInputing)
				System.out.println("正在输入...");
		}
	}
}
最后,贴上调试时的后台输入,帮助理解!(输入1~9,中间非连续速度输入。)【多线程文章可参考: guomutian911

欢迎大家进一步交流、改进!Q:316190672,兰州理工大学,郭立。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值