续前文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实现文本编辑时基于拼音输入的补全原型的更多相关文章

  1. JAVA学习笔记(1)—— eclipse自动补全和主题及字体配置

    1.自动补全功能 (1)打开 Eclipse -> Window -> Perferences (2)选择Java -> Editor -> Content Assist -& ...

  2. 史上巨坑: vim的"set foldmethod=syntax"设置竟然是导致ctrl+p(ctrl+n)补全在文件稍大时光标位于中间位置补全效率变慢的元凶!

    最近我的vim又让我闹心了. 问题出现在supertab的补全速度上, 有时候按下tab键半天才弹出补全列表, 即便是弹出了列表在列表上下移动也变得的相当缓慢, 这让我的很是蛋疼. 在完全无法接受这个 ...

  3. 基于Jquery-ui的自动补全

    1.添加CSS和JS引用 <script type="text/javascript" src="javascript/jquery-1.7.min.js" ...

  4. Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全

    导读 行文本输入框在用于界面的文本输入,在WEB登录表单中应用广泛.一般行文本编辑框可定制性较高,既可以当作密码输入框,又可以作为文本过滤器.QLineEdit本身使用方法也很简单,无需过多的设置就能 ...

  5. WinForm AutoComplete 输入提示、自动补全

    一.前言 又临近春节,作为屌丝的我,又要为车票发愁了.记得去年出现了各种12306的插件,最近不忙,于是也着手自己写个抢票插件,当是熟悉一下WinForm吧.小软件还在开发中,待完善后,也写篇博客与大 ...

  6. VS Code Java 3月更新|代码补全、Maven 以及 Java 插件预览版本新升级!

    Nick Zhu Senior Program Manager, Developer Division at Microsoft 大家好,欢迎来到 Visual Studio Code Java 的 ...

  7. java整合Elasticsearch,实现crud以及高级查询的分页,范围,排序功能,泰文分词器的使用,分组,最大,最小,平均值,以及自动补全功能

    //为index创建mapping,index相当于mysql的数据库,数据库里的表也要给各个字段创建类型,所以index也要给字段事先设置好类型: 使用postMan或者其他工具创建:(此处我使用p ...

  8. Xcode括号自动补全以及二次编译后不显示输入

    今天遇到了一个大坑,在使用栈来进行计算表达式的时候,发现输入括号就报错,以及二次编译后不显示. 测试了好久,经过无数次debug后. 二次编译不显示还是没搞明白,不过输入倒是没什么问题,就是不显示出来 ...

  9. 基于 Java 2 运行时安全模型的线程协作--转

    在 Java 2 之前的版本,运行时的安全模型使用非常严格受限的沙箱模型(Sandbox).读者应该熟悉,Java 不受信的 Applet 代码就是基于这个严格受限的沙箱模型来提供运行时的安全检查.沙 ...

随机推荐

  1. Spring Boot 1.4测试的简单理解

    首先maven要引入spring-boot-starter-test这个包. 先看一段代码 @RunWith(SpringRunner.class) @SpringBootTest(webEnviro ...

  2. Kali Linux桥接模式配置DNS服务器

    操作环境: 虚拟机操作系统: Kali Linux 2017.2 虚拟化软件: VMWare Workstation 14 pro 操作前的准备: 在设置里将Kali的上网模式设置成"桥接模 ...

  3. valueOf函数详解

    在类型转换中,经常用到方法valueOf()和他toString(),所有对象(包括基本包装类型)都拥有这两个方法.这篇文章我们先看看valueOf()方法.valueOf()方法会将对象转换为基本类 ...

  4. PHP Simple HTML DOM解析器使用入门

    http://www.cnphp.info/php-simple-html-dom-parser-intro.html 一直以来使用php解析html文档树都是一个难题.Simple HTML DOM ...

  5. ConnectionString 属性尚未初始化

    关于"ConnectionString 属性尚未初始化"的问题(如下图),      我在下面一段代码中发现了问题所在:   public bool ReturnFlag(stri ...

  6. BZOJ_4518_[Sdoi2016]征途_斜率优化

    BZOJ_4518_[Sdoi2016]征途_斜率优化 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到 ...

  7. java Dated Dateformat Calendar

    Date类概述 类Date表示特定的瞬间,精确到毫秒.1000毫秒=1秒 时间的原点:公元1970年 一月一日,午夜0:00:00 对应的毫秒值就是0 注意:时间和日期的计算,必须依赖毫秒值 long ...

  8. hydra暴力破解ssh服务器密码

    概述 我都没想到,第一次暴力破解服务器密码.竟然是对自己的单位服务器出手..囧,因为还没来得及找测试部要来服务器登录密码,测试部负责人已经下班走了.后来又联系不上,这要更新代码,怎么办..于是就对测试 ...

  9. 2D图形如何运动模拟出3D效果

    一.先看看实现效果图 (左边的2d图片如何运动出右边3d的效果)                                      引言: 对于这个题目,真的很尴尬,不知道取啥,就想了这个题目 ...

  10. 8000个JQuery特效(插件)

    各式各样的JQuery场景实现,可供项目使用,请注意插件版本和浏览器适配 下面是下载地址