c语言编写简易的文本编辑器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言编写简易的文本编辑器相关的知识,希望对你有一定的参考价值。
文本编辑器 功能如下:
1.被编辑的文本以“行”的组织形式,每一文本行都以行结束符结束
2.输入为若干文本行(可能为0文本行)和若干编辑操作(可能无操作)
3.输出为若干文本行(可能为0文本行)
4.编辑操作开始时,光标位于第一行第一列(编辑器左上角)处
5.光标可通过上移、下移、左移、右移操作移至任一字符(包括行结束)处,一个移动操作 光标移动一次
6.输入操作:输入操作是在光标的位置插入被输入的字符,输入的字符可为打印字符或行结束符,输入一个字符后,
、光标移动到下一字符处;因为反斜杠线作为转移字符使用,所以用两个反斜线表示输入了一个反斜线字符。
7.上移操作:光标移至当前行的上一行,如果当前是第一行,则此操作无用
8.下移操作:光标移至当前行的下一行,如果当前是最后一行,则此操作无用
9.左移操作:光标左移一列,如果当前为第一列,则此操无用
10.右移操作:光标右移一列,如果当前为当前行的最后一列(光标位于行结束符处),则此操无用
11.删除操作:删除光标所在位置字符;删除操作后,光标位置不表;当编辑的文本中只有一个行结束符时,删除该行结束符后,编辑目标为空,
否则删除最后一行的行结束 符操作无作用
12.如果无编辑(0文本行),则移动操作和删除操作无作用
13.如果编辑文本不为空(不是0文本行),则最后一行文本不用显式输入行结束符,编辑器应能自动添加行结束符。
14.在连续执行一个以上的上下移动操作过程中,执行第一个上下移动操作前光标所在的列可称为起始列,光标在上下移动时,如果目标行的最后一个字符在起始列的右侧,
则光标移至目标行的起始列,否则光标移动到目标行的末位。
不过这里有一个简易文本编译器。虽说是简易,也不是那么好弄的,给你:
http://zhidao.baidu.com/question/79338502.html 参考技术A 不为答题,特为吐槽:
这个项目拿c#java甚至python全日工作都得写至少一个星期吧。你还用c…… 参考技术B 北京科技大学的吧。。。
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) {
}
}
}
参考
Detecting when user presses enter in Java
Java SWING JFrame Layouts Example
以上是关于c语言编写简易的文本编辑器的主要内容,如果未能解决你的问题,请参考以下文章