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

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

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

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

实现源码如下. 不采用第三方库, 比较粗糙的代码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

原文地址:https://www.cnblogs.com/program-in-chinese/p/10635953.html

时间: 2024-11-08 15:56:11

Java实现"命令式"简易文本编辑器原型的相关文章

简易文本编辑器(Delphi源码)

计划一个简略单纯的文本编纂器,具有建立.编纂.生存平凡文本文件的功能. unit U nit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ExtCtrls; type  TForm1 = class(TForm)    Panel1: TPanel;    Memo1: TMemo;    OpenDialog1:

C++ mfc 简易文本编辑器 遇到的一些问题

[题目40]简易文本编辑器. 设计一个简易的文本编辑器. 设计要求: (1) 具有图形菜单界面: (2) 查找,替换(等长,不等长),插入(插串,文本块的插入).文本块移动(行块,列块移动),删除; (3) 可正确存盘.取盘: (4) 正确显示总行数. 这是题目.................. 使用基于对话框的MFC   我想到的感觉有问题的点! 查找替换 算法不了解  最烦人的时文本块移动 百度好多业找不到!!呵呵难受的是在吾爱发个两个帖子求一下思路 被狗骂了那个人是真的神精符附上链接ht

[汇编] 汇编语言实现简易文本编辑器(光标移动、上卷和退格删除)

汇编实现的一个简易的文本编辑器,代码中有详细的注释. 思路和细节: (1) 在屏幕中央初始化一片面积,并且定位光标,利用16号中断0号功能分别在ah,al中存储扫描码和ascii码,由此进行功能键的判断. (2) 实现对光标的操作,通过对dh,dl的变化和10号中断的2号功能进行光标的设置,上下左右分别改变dh,dl的值即可. (3)退格键的操作实现是 光标左移,然后利用21号中断输出空格即可实现删除操作. (4)下界超过某一个设定的值后就进行上卷一行的操作,此时当前光标位置随之上移. (5)注

Java开发之富文本编辑器TinyMCE

一.题外话 最近负责了一个cms网站的运维,里面存在很多和编辑器有关的问题,比如编辑一些新闻博客,论文模块.系统采用的是FCKEditor,自我感觉不是很好,如下图 特别是在用户想插入一个图片的话,就很麻烦,所有用户共享一个文件目录,这样就不好了,于是便想到了TinyMCE编辑器,博客园默认的也是这个编辑器,接下 来,我们开始吧 二.TinyMCE编辑器集成步骤 2.1:下载相关文件 (1)下载TinyMCE插件包 下载地址:   https://www.tinymce.com/download

java文本编辑器5

1 package peng_jun; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 6 import javax.swing.*; 7 8 import java.io.*; 9 10 import javax.swing.filechooser.*; 11 12 import java.awt.datatransfer.*; 13 14 public class Text4 extends JFrame { 15 public sta

java文本编辑器 版本4

1 package peng_jun; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 6 import javax.swing.*; 7 8 import java.io.*; 9 10 import javax.swing.filechooser.*; 11 12 import java.awt.datatransfer.*; 13 14 public class Text3 extends JFrame { 15 public sta

Java-Swing中实现富文本编辑器

问题介绍 使用Java-swing技术实现邮件发送功能.(为什么使用Java,因为我们组没学过C#) 邮件编辑使用富文本编辑器,用户可以自定义邮件格式. 支持上传图片. 支持附件发送. 内容支持名字的替换,显得像是单独给某个人发的一样. 功能图片展示 解决过程 开始看到这个需求,也没有什么想法感觉还好,于是百度.谷歌了一堆东西.首先百度Java swing的富文本编辑器组件,虽然确实找到了几个组件但是都是很老的版本,而且是一个独立的弹窗,样式也有点难看.问了一下学长的意见,说:“接受不了独立弹窗

简易文本编译器

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <math.h>#define MAX_LEN 240#define NOT_FOUND -1//函数声明  void HeadWord(void);      //输出大标题,永远出现在程序的最顶端.  void PrintWord(void);    //输出文本的内容 void

Java实现简易的文本编辑器

需求分析: 获得文本名称 实现尾部追加功能 实现覆盖式添加数据 删除数据 获取光标位置 在特定光标位置处添加数据 查找特定字符串在主串中第一次出现的位置 统计文本文件内出现的数字,汉字,英文字母,特殊字符的个数,及总的字符个数 开发环境: windows7 + Eclipse luna + WindowsBuilder插件 代码实现: import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.ev