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 代码就是基于这个严格受限的沙箱模型来提供运行时的安全检查.沙 ...
随机推荐
- compose合并函数依次执行 - 来源redux
function compose(...funcs) { if (funcs.length === 0) { return arg => arg } if (funcs.length === 1 ...
- 【转】JavaScript的异常处理
当 JavaScript 引擎执行 JavaScript 代码时,有可能会发生各种异常,例如是语法异常,语言中缺少的功能,由于来自服务器或用户的异常输出而导致的异常. 而 Javascript 引擎是 ...
- ztre的使用入门
1.首先需要下载ztree插件, 2.把下载的插件中的js和css放到项目中去(img文件默认放到css文件下方,如果把img文件放到其他地方,加载出来的树将没有默认图标(文件夹图标)和节点前的展开闭 ...
- 如何识别企业内的“千里马”?
很多企业主都在感叹无法找到合适的优秀管理人才,却忽视了一条获得管理人才的捷径:内部培养.在员工中挑选具有领导潜质的人才,加以培养,必成企业栋梁,而且这样选拔的人才与企业的契合度.忠诚度方面都相对较高. ...
- Boyer-Moore(BM)算法,文本查找,字符串匹配问题
KMP算法的时间复杂度是O(m + n),而Boyer-Moore算法的时间复杂度是O(n/m).文本查找中“ctrl + f”一般就是采用的BM算法. Boyer-Moore算法的关键点: 从右遍历 ...
- Oracle-08:连接查询
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 首先提供数据库脚本,供测试使用 create table DEPT ( deptno ) not null, ...
- 修复lvm的逻辑卷
一.背景 公司传统的服务器不知道什么朝代的朝臣用lvm分区,1T的硬盘分了50G挂载到根目录"/"里面有/var./usr--,剩下的挂载到了"/home"目录 ...
- java的系统时间,怎么计算从现在到凌晨还剩下多少时间?
Apache commons-lang3 long milliSecondsLeftToday = 86400000 - DateUtils.getFragmentInMilliseconds(Cal ...
- WebSocket和Socket
WebSocket和Socket tags:WebSocket和Socket 引言:好多朋友想知道WebSocket和Socket的联系和区别,下面应该就是你们想要的 先来一张之前收集的图,我看到这张 ...
- Nginx多虚拟主机下泛域名配置
http://www.tuicool.com/articles/F3Azuq 近上一个应用,让用户可以自定义二级域名,所以要配置一个泛域名来解析用户的自定义域名. 首先来说说nginx下的泛域名配置 ...