续前文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. tomcat并发优化之三种接收处理请求方式(BIO、NIO、APR)介绍

    原文链接:http://blog.csdn.net/xyang81/article/details/51502766 Tomcat支持三种接收请求的处理方式:BIO.NIO.APR 1>.BIO ...

  2. Struts2中数据封装方式

    一.通过ActionContext类获取 public class ActionContextDemo extends ActionSupport {    @Override    public S ...

  3. 消息中间件activemq的使用场景介绍(结合springboot的示例)

    一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构.是大型分布式系统不可缺少的中间件. 目前在生产环境,使 ...

  4. ZooKeeper的使用---Java程序

    一.导入库 以下库存放在目录lib中: audience-annotations-0.5.0.jar jline-0.9.94.jar log4j-1.2.17.jar netty-3.10.6.Fi ...

  5. 开启irqbalance提升服务器性能

    操作系统 性能调休   公司有次压测存在一个问题:CPU资源压不上去,一直在40%已达到了性能瓶颈,后定位到原因,所在的服务器在压测过程中产生的中断都落在CPU0上处理,这种中断并没有均衡到各个CPU ...

  6. 文字分列 CSS属性

    column 这里有一系列新的CSS属性,可以帮助你很轻松的实现文字的多列布局.让我们瞧瞧: .three-column { padding: 1em; -moz-column-count: 3; - ...

  7. Python Django 1.Hello Django

    #安装Djangopip install Django #==版本号#选择路径:D:#任意文件夹名 cd Django #罗列Django所提供的命令,其中startproject命令来创建项目 dj ...

  8. 计算机17-3,4作业A

    A货车过隧道问题 Description 输入若干组数据,每组数据中有三个整数分别表示某条公路沿途所经过的三个隧道的最大高度,数之间用单个空格分隔.输入高度单位是厘米,范围在0到762之间.现有一台高 ...

  9. Random在高并发下的缺陷以及JUC对其的优化

    Random可以说是每个开发都知道,而且都用的很6的类,如果你说,你没有用过Random,也不知道Random是什么鬼,那么你也不会来到这个技术类型的社区,也看不到我的博客了.但并不是每个人都知道Ra ...

  10. 【BAT面试题系列】面试官:你了解乐观锁和悲观锁吗?

    前言 乐观锁和悲观锁问题,是出现频率比较高的面试题.本文将由浅入深,逐步介绍它们的基本概念.实现方式(含实例).适用场景,以及可能遇到的面试官追问,希望能够帮助你打动面试官. 目录 一.基本概念 二. ...