Java实现命令式简易文本编辑器原型

简介: Java实现"命令式"简易文本编辑器原型

2019_03_30_text_

源自早先想法, 打算从界面方向做些尝试. 找到个简单文本编辑器的实现: Simple Text Editor - Java Tutorials. 原本的菜单/按钮界面如下. 包括基本功能: 新建/打开/保存文件, 文本编辑与剪切/复制/粘贴.
2019_03_30_UI_

把所有菜单/按钮替换为命令输入后效果如下, 源码库在: program-in-chinese/simple-text-editor-in-Java. 与其他命令行工具一样, 省去界面元素的代价是输入较繁琐. 在文本和命令两处切换也有点麻烦.
2019_03_30_text_

接下去试着实现命令输入的自动补全等等.

实现源码如下. 不采用第三方库, 比较粗糙的代码180行.

public class 文本编辑器 extends JFrame {

  private static final String 默认文件名 = "无名";

  private JTextArea 文本区域 = new JTextArea(20, 120);
  private JTextArea 命令文本区 = new JTextArea(5, 20);
  private JFileChooser 对话框 = new JFileChooser(System.getProperty("user.dir"));
  private String 当前文件 = 默认文件名;
  private String 当前命令 = "";
  private boolean 已改 = false;

  public static void main(String[] arg) {
    new 文本编辑器();
  }

  public 文本编辑器() {
    文本区域.setFont(new Font("Monospaced", Font.PLAIN, 12));
    JScrollPane 文本区 = new JScrollPane(文本区域, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
        JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    add(文本区, BorderLayout.CENTER);

    命令文本区.setFont(new Font("Monospaced", Font.PLAIN, 12));
    JScrollPane 命令区 = new JScrollPane(命令文本区, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
        JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    add(命令区, BorderLayout.EAST);

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pack();
    文本区域.addKeyListener(监听文本输入);
    命令文本区.addKeyListener(命令监听);
    setTitle(当前文件);
    setVisible(true);
  }

  private KeyListener 监听文本输入 = new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
      已改 = true;
    }
  };

  private KeyListener 命令监听 = new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
      if (e.getKeyCode() == KeyEvent.VK_ENTER) {
        int 行数 = 命令文本区.getLineCount();
        if (行数 == 1) {
          当前命令 = 命令文本区.getText();
        } else {
          try {
            int 上一行末位置 = 命令文本区.getLineEndOffset(行数 - 2);
            当前命令 = 命令文本区.getText().substring(上一行末位置);
          } catch (BadLocationException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
          }
        }
        执行(当前命令);
      }
    }
  };

  private void 执行(String 当前命令) {
    switch (当前命令) {
      case "新建":
        新建操作();
        break;
      case "打开":
        打开操作();
        break;
      case "保存":
        保存操作();
        break;
      case "另存":
        另存文件为();
        break;
      case "退出":
        退出操作();
        break;
      case "剪切":
        文本区域.cut();
        break;
      case "复制":
        文本区域.copy();
        break;
      case "粘贴":
        文本区域.paste();
        break;
      default:
        // TODO: 提示无此命令或显示帮助
        break;
    }
  }

  private void 新建操作() {
    保存旧文件();
    文本区域.setText("");
    当前文件 = 默认文件名;
    setTitle(当前文件);
    已改 = false;
  }

  private void 打开操作() {
    保存旧文件();
    if (对话框.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
      读入文件(对话框.getSelectedFile().getAbsolutePath());
    }
  }

  private void 保存操作() {
    if (!当前文件.equals(默认文件名))
      保存文件(当前文件);
    else
      另存文件为();
  }

  private void 退出操作() {
    保存旧文件();
    System.exit(0);
  }

  private void 另存文件为() {
    if (对话框.showSaveDialog(null) == JFileChooser.APPROVE_OPTION)
      保存文件(对话框.getSelectedFile().getAbsolutePath());
  }

  private void 保存旧文件() {
    if (已改) {
      if (JOptionPane.showConfirmDialog(this, "保存 " + 当前文件 + " 吗?", "保存",
          JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
        保存文件(当前文件);
    }
  }

  private void 读入文件(String 文件名) {
    try {
      FileReader 读 = new FileReader(文件名);
      文本区域.read(读, null);
      读.close();
      当前文件 = 文件名;
      setTitle(当前文件);
      已改 = false;
    } catch (IOException e) {
      Toolkit.getDefaultToolkit().beep();
      JOptionPane.showMessageDialog(this, "找不到 " + 文件名);
    }
  }

  private void 保存文件(String 文件名) {
    try {
      FileWriter 写 = new FileWriter(文件名);
      文本区域.write(写);
      写.close();
      当前文件 = 文件名;
      setTitle(当前文件);
      已改 = false;
    } catch (IOException e) {
    }
  }
}

参考

adding a console to a Jframe

Detecting when user presses enter in Java

Java SWING JFrame Layouts Example

相关文章
|
1月前
|
JavaScript 前端开发 Java
Java Script中的函数原型是什么
Java Script中的函数原型是什么
11 0
|
2月前
|
存储 前端开发 Java
基于云计算的Java电子病历编辑器源码 (B/S)
EMR: 病历数据、控件数据、病历模板数据、同步数据、病历个人模板数据、病历质控数据
33 1
|
2月前
|
存储 前端开发 JavaScript
医院电子病历编辑器源码 (java语言)
电子病历(EMR,Electronic Medical Record)是用电子技术保存、管理、传输和重现的数字化的病人的医疗记录,取代手写纸张病历,将医务人员在医疗活动过程中,使用医疗机构管理系统生成的文字、符号、图表、图形、数据、影像等数字化内容,并能实现存储、管理、传输和重现的医疗记录,是病历的一种记录形式。
63 1
|
20天前
|
Java
Java实现简易文本编辑器
Java实现简易文本编辑器
16 1
|
1月前
|
存储 前端开发 JavaScript
JAVA医院电子病历编辑器系统源码
电子病历编辑器极具灵活性,它既可嵌入到医院HIS系统中,作为内置编辑工具供多个模块使用,也可以独立拿出来,与第三方业务厂商展开合作,为他们提供病历书写功能,充分发挥编辑器的功能。
108 8
|
4月前
|
存储 搜索推荐 Java
java基于B/S模式的医院电子病历编辑器源码
电子病历内涵应包括: 1.信息共享。医院各个部门、科室在任何时间和地点都能调阅到病人所在医院的全部病历记录; 2.具有预警功能,对药物配伍禁忌、医疗方法不当进行提示; 3.支持医疗信息资料库,供医疗人员在工作时查询使用。
47 1
|
9月前
|
IDE Java 编译器
很多up主都在使用的Editplus,强大的编辑器-并附有编译&执行配置 & java编译(新款发放)
很多up主都在使用的Editplus,强大的编辑器-并附有编译&执行配置 & java编译(新款发放)
|
3月前
|
搜索推荐 Java
完整版Java电子病历EMR编辑器系统源码
完整版Java电子病历EMR编辑器系统源码
61 0
|
4月前
|
存储 前端开发 JavaScript
【Java】电子病历编辑器源码(云端SaaS服务)
【Java】电子病历编辑器源码(云端SaaS服务)
28 0
|
4月前
|
存储 前端开发 JavaScript
Java电子病历编辑器项目源码 采用B/S(Browser/Server)架构
Java电子病历编辑器项目源码 采用B/S(Browser/Server)架构
28 0