Java实现文本编辑时基于拼音输入的补全原型
发布日期:2021-06-29 15:31:54
浏览次数:3
分类:技术文章
本文共 2407 字,大约阅读时间需要 8 分钟。
续前文. 效果如下:
所在源码库同上文, 尚未和上文的编辑器右侧的命令区集成. 代码由修改得来.
基本功能
- 英文输入至少一个匹配词典的字母后, 显示提示框
- 上下光标选中某提示项后按空格键自动替换
- 弹出提示框后, 如果继续键入, 提示框隐藏后, 根据新键入继续提示. 比如上面输入’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创建提示列表(final String[] 提示列表) { JList 列表 = 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提示词典 = 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[] { "退出", "粘贴"}); }
转载地址:https://codeinchinese.blog.csdn.net/article/details/88990128 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月04日 22时27分05秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
聊聊我是如何编程入门的
2019-04-29
J-Link该如何升级固件?
2019-04-29
485通信自动收发电路,历史上最详细的解释
2019-04-29
【视觉盛宴三】不好意思,这些线材接口的横截面真的没见过
2019-04-29
一位头发发白的神人教你怎么写程序,运维,买电脑,写文章,平面设计!
2019-04-29
【第二期】那些设计漂亮、有创意的电路板!
2019-04-29
【第三期】那些设计漂亮、有创意的电路板!
2019-04-29
继续推荐公众号~
2019-04-29
「第二篇」全国一等奖,经验帖。
2019-04-29
「第三篇」全国电子设计竞赛,这些你必须知道的比赛细节,文末附上近十年电赛题目下载...
2019-04-29
5G小科普(漫画版,So easy!)
2019-04-29
无人再提华强北
2019-04-29
千万不要小瞧那些不好好写代码的程序员
2019-04-29
80后,天才程序员, Facebook 第一任 CTO,看看开挂的人生到底有多变态?
2019-04-29
「第四篇」电赛控制题可以准备一些什么?
2019-04-29
「第五篇」全国电子设计竞赛-电源题设计方案总结
2019-04-29
「第六篇」对于电赛,我们应该看重什么?
2019-04-29
树莓派翻车了
2019-04-29
垃圾分类背后的数据和真相
2019-04-29
PID算法搞不懂?看这篇文章就够了。
2019-04-29