Java实现文本编辑时基于拼音输入的补全原型
续前文Java实现"命令式"简易文本编辑器原型. 效果如下:

所在源码库同上文, 尚未和上文的编辑器右侧的命令区集成. 代码由How to show autocomplete as I type in JTextArea?修改得来.
基本功能
- 英文输入至少一个匹配词典的字母后, 显示提示框
- 上下光标选中某提示项后按空格键自动替换
- 弹出提示框后, 如果继续键入, 提示框隐藏后, 根据新键入继续提示. 比如上面输入't'后提示"退出"和"粘贴"两项, 继续输入'c'后就只显示"退出"
IDE和中文输入法的深度集成是必然趋势. 虽然现在第三方的中文输入法可以解决"输入"的基本功能, 但在IDE自动补全/智能提示功能日益成为开发效率提升的必需辅助功能的现今, 只有实现了中文输入法和IDE补全/提示的集成, 中文编程才能更接近实用. 这早已在易语言开发环境中实现, 期待早日看到开源项目实现类似功能.
源码简单说明
监听文本框的按键输入, 并准备弹出提示框:
文本区.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
随后显示提示();
}
...
});
弹出之前, 先获取此次输入的字符串, 并基于它生成/更新提示框:
private void 显示提示() {
final int 文本位置 = 文本区.getCaretPosition();
Point 界面位置;
try {
界面位置 = 文本区.modelToView(文本位置).getLocation();
} catch (BadLocationException e2) {
e2.printStackTrace();
return;
}
final String 提示源词 = 取提示源词(文本位置);
if (提示源词 == null) {
return;
}
if (提示 == null) {
提示 = new 提示框(文本区, 文本位置, 提示源词, 界面位置);
} else {
提示.更新(文本位置, 提示源词, 界面位置);
}
}
提示框部分, 由一个列表来管理提示项的选择, 文本的替换:
private JList<String> 创建提示列表(final String[] 提示列表) {
JList<String> 列表 = new JList<>(提示列表);
列表.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
列表.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
列表.setSelectedIndex(0);
列表.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyChar() == KeyEvent.VK_SPACE) {
if (插入选择文本()) {
隐藏();
}
} else {
隐藏();
文本区.requestFocusInWindow();
文本区.dispatchEvent(e);
}
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
下移();
} else if (e.getKeyCode() == KeyEvent.VK_UP) {
上移();
}
}
...
});
return 列表;
}
当然少不了一个字符->中文词典(如下), 实际应用时需要基于拼音生成提示的算法
private static final HashMap<String, String[]> 提示词典 = new HashMap<>();
static {
提示词典.put("xj", new String[] {"新建"});
提示词典.put("dk", new String[] {"打开"});
提示词典.put("bc", new String[] {"保存"});
提示词典.put("jq", new String[] {"剪切"});
提示词典.put("fz", new String[] {"复制"});
提示词典.put("nt", new String[] {"粘贴"});
提示词典.put("zt", new String[] {"粘贴"});
提示词典.put("tc", new String[] {"退出"});
提示词典.put("j", new String[] {"新建", "剪切"});
提示词典.put("t", new String[] {"退出", "粘贴"});
}
Java实现文本编辑时基于拼音输入的补全原型的更多相关文章
- JAVA学习笔记(1)—— eclipse自动补全和主题及字体配置
1.自动补全功能 (1)打开 Eclipse -> Window -> Perferences (2)选择Java -> Editor -> Content Assist -& ...
- 史上巨坑: vim的"set foldmethod=syntax"设置竟然是导致ctrl+p(ctrl+n)补全在文件稍大时光标位于中间位置补全效率变慢的元凶!
最近我的vim又让我闹心了. 问题出现在supertab的补全速度上, 有时候按下tab键半天才弹出补全列表, 即便是弹出了列表在列表上下移动也变得的相当缓慢, 这让我的很是蛋疼. 在完全无法接受这个 ...
- 基于Jquery-ui的自动补全
1.添加CSS和JS引用 <script type="text/javascript" src="javascript/jquery-1.7.min.js" ...
- Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
导读 行文本输入框在用于界面的文本输入,在WEB登录表单中应用广泛.一般行文本编辑框可定制性较高,既可以当作密码输入框,又可以作为文本过滤器.QLineEdit本身使用方法也很简单,无需过多的设置就能 ...
- WinForm AutoComplete 输入提示、自动补全
一.前言 又临近春节,作为屌丝的我,又要为车票发愁了.记得去年出现了各种12306的插件,最近不忙,于是也着手自己写个抢票插件,当是熟悉一下WinForm吧.小软件还在开发中,待完善后,也写篇博客与大 ...
- VS Code Java 3月更新|代码补全、Maven 以及 Java 插件预览版本新升级!
Nick Zhu Senior Program Manager, Developer Division at Microsoft 大家好,欢迎来到 Visual Studio Code Java 的 ...
- java整合Elasticsearch,实现crud以及高级查询的分页,范围,排序功能,泰文分词器的使用,分组,最大,最小,平均值,以及自动补全功能
//为index创建mapping,index相当于mysql的数据库,数据库里的表也要给各个字段创建类型,所以index也要给字段事先设置好类型: 使用postMan或者其他工具创建:(此处我使用p ...
- Xcode括号自动补全以及二次编译后不显示输入
今天遇到了一个大坑,在使用栈来进行计算表达式的时候,发现输入括号就报错,以及二次编译后不显示. 测试了好久,经过无数次debug后. 二次编译不显示还是没搞明白,不过输入倒是没什么问题,就是不显示出来 ...
- 基于 Java 2 运行时安全模型的线程协作--转
在 Java 2 之前的版本,运行时的安全模型使用非常严格受限的沙箱模型(Sandbox).读者应该熟悉,Java 不受信的 Applet 代码就是基于这个严格受限的沙箱模型来提供运行时的安全检查.沙 ...
随机推荐
- Java高并发之无锁与Atomic源码分析
目录 CAS原理 AtomicInteger Unsafe AtomicReference AtomicStampedReference AtomicIntegerArray AtomicIntege ...
- [Kali_Metasploit]db_connect创建连接时无法连接的解决方案
问题1复现路径: postgresql selected, no connection 第一步: db_connect postgres:toor@127.0.0.1/msfbook 连接成功不需要进 ...
- swagger-codegen自动生成代码工具的介绍与使用
一.Swagger Codegen简介 Swagger Codegen是一个开源的代码生成器,根据Swagger定义的RESTful API可以自动建立服务端和客户端的连接.Swagger Codeg ...
- sap 内表
内表的目的在ABAP/4中,主要使用表格.表格是R/3系统中的关键数据结构.长期使用的数据存储在关系数据库表格中.关于如何读取和处理数据库表格的详细信息,参见读取并处理数据库表.除了数据库表格,还可以 ...
- YII框架CGridView sql有条件分页实现
$SQL="SELECT * FROM {{user}} WHERE `typeff`=2 order by create_time desc"; $SQL_count=" ...
- 跟我学ASP.NET MVC之三:完整的ASP.NET MVC程序-PartyInvites
摘要: 在这篇文章中,我将在一个例子中实际地展示MVC. 场景 假设一个朋友决定举办一个新年晚会,她邀请我创建一个用来邀请朋友参加晚会的WEB程序.她提出了四个注意的需求: 一个首页展示这个晚会 一个 ...
- CSS float:right 在IE浏览器下换行
在换行的html标签内加如下样式 style="right: 0px; position: absolute;"
- registration_db.go
, atomic.LoadInt64(&p.peerInfo.lastUpdate)) if now.Sub(cur) > inactivityTimeout || p. ...
- orcl数据库先决条件检查时失败
在服务里面开启下面服务,在cmd输入 services.msc 就能打开[服务] 在cmd输入以下命令 我的是server服务没开,然后开了资源共享,就安装成功了
- MATLAB R2017b安装及破解(安装详解)
昨天知道有这个Matlab之后就开始想办法安装,今天为各位小伙伴解答昨天安装的过程,希望能够帮助到你们! 使用的镜像软件,我放在压缩包里面 如果你们感觉下载比较麻烦(可以直接发消息给我,我会发给你们的 ...