源自早先想法, 打算从界面方向做些尝试. 找到个简单文本编辑器的实现: 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

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

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

    [题目40]简易文本编辑器. 设计一个简易的文本编辑器. 设计要求: (1) 具有图形菜单界面: (2) 查找,替换(等长,不等长),插入(插串,文本块的插入).文本块移动(行块,列块移动),删除; ...

  2. javascript 简易文本编辑器

    转载请注明出处:http://www.cnblogs.com/enzozo/p/4357031.html 写在前面: 本文本编辑器具备功能:选择字体大小.颜色.加粗.斜体.下划线.点击 'Submit ...

  3. AUTOGUI生成的一个简易文本编辑器

    ; Generated by AutoGUI #SingleInstance Force #NoEnv SetWorkingDir %A_ScriptDir% SetBatchLines - #Inc ...

  4. Java开发之富文本编辑器TinyMCE

    一.题外话 最近负责了一个cms网站的运维,里面存在很多和编辑器有关的问题,比如编辑一些新闻博客,论文模块.系统采用的是FCKEditor,自我感觉不是很好,如下图 特别是在用户想插入一个图片的话,就 ...

  5. java文本编辑器5

    package peng_jun; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.* ...

  6. Java-Swing中使用Web富文本编辑器

    资料下载 (截取出了邮件发送的功能.) 2018/11/10 因为要 win7 电脑 IE 8 的原因,使用了 jxBrower 拓展,更容易使用,参考链接(推荐) 问题介绍 window客户端软件的 ...

  7. Java实现简易的文本编辑器

    需求分析: 获得文本名称 实现尾部追加功能 实现覆盖式添加数据 删除数据 获取光标位置 在特定光标位置处添加数据 查找特定字符串在主串中第一次出现的位置 统计文本文件内出现的数字,汉字,英文字母,特殊 ...

  8. Java编写的文本编辑器(菜鸟作品)

    //这是主窗体文件 Wordwin.java import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.sw ...

  9. 简易富文本编辑器bootstrap-wysiwyg源码注释

    好久没写随笔了,因为最近比较忙,小公司基本都是一个前端干所有属于和部分不属于前端的事情,所以就没空弄了,即使想分享,也因为没有时间和精力就搁置了. 这周周六日休息,正好时间比较充裕(ps:目前处在单休 ...

随机推荐

  1. 微服务架构 - SpringBoot整合Jooq和Flyway

    在一次学习分布式跟踪系统zipkin中,发现了jooq这个组件,当时不知这个组件是干嘛的,后来抽空学习了一下,感觉这个组件还挺用的.它主要有以下作用: 通过DSL(Domain Specific La ...

  2. Java - 静态代理详讲

    Java - 静态代理详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面:*此章内容比较抽象,所以需要结合实际操作进行讲解*                   *需要有 ...

  3. 8天入门docker系列 —— 第二天 通过一个aspnetcore程序加深对容器的理解

    我们知道容器是一个打包了应用和相关依赖的盒子,那怎么去操控这个盒子呢? 这一篇我通过一个简单的aspnetcore程序来加深对盒子的理解,使用之前先 安装一下Docker的环境. 一:Docker的安 ...

  4. 入门系列之使用Sysdig监视您的Ubuntu 16.04系统

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由乌鸦 发表于云+社区专栏 介绍 Sysdig是一个全面的开源系统活动监控,捕获和分析应用程序.它具有强大的过滤语言和可自定义的输出,以 ...

  5. .NET(WinCE、WM)转Android开发——Xamarin和Smobiler对比

    对比 WinCE Android 行业场景 扫描分拣.车载.工控 扫描分拣.车载定位 开发语言 C++.C# Java/.NET(Smobiler) 开发环境 Visual Studio Androi ...

  6. Nginx 一个高性能的HTTP和反向代理服务器

    本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解过,欢迎留言交流. Nginx能做什么 ——反向 ...

  7. The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "SDSSDFCC" was unable to begin a distributed transaction.

    Question: SQL SERVER 通过Linkserver连接A和B 2台,A对B执行单条的增删改查没有异常(没有配置DTC) 但是开启事务后就会出现报错 Solution: 在A和B上配置D ...

  8. 【原】无脑操作:Gitblit服务器搭建及IDEA整合Git使用

    背景:虽然有GitHub.GitLab这样强大的Git仓库,但是涉及私有Git库要收费,所以自己动手搭建免费的用用 环境:windows 7 旗舰版.JDK 1.8.IDEA 2017 ------- ...

  9. 'module' object has no attribute 'Thread'解决方法及模块加载顺序

    源码片段: class myThread(threading.Thread): def __init__(self, threadID, name, counter): threading.Threa ...

  10. iOS 字典转模型Model

    基本原理 利用 runtime 原理,获取模型中所有实例变量列表,根据实例变量以此获取模型中成员变量的名称和属性类型,区分Foundation和自定义属性,需要对NSDictionary和NSArra ...