📄 simpleeditor.java
字号:
lineNoConsoleSplitPane.setDividerLocation(500);
treeFlashSplitPane.setDividerLocation(120);
//初始化帮助
initHelp();
getContentPane().setLayout(new BorderLayout());
getContentPane().add(toolBar, BorderLayout.NORTH);
getContentPane().add(leftRightSplitPane);
}
/**
* 初始化帮助信息
*/
private void initHelp(){
//帮助信息主要显示菜单的快捷方式
// field存放JTable的表头信息,即表的标题
String[] field = { "MenuItem", "ShortCut Key" };
// data存放JTable的数据。
Object[][] data = { { " New ", " Ctrl+N " },
{ " Open ", " F12 " },
{ " Save ", " Ctrl+S " },
{ " Exit ", " Ctrl+X " },
{ " Find ", " Alt " },
{ " Find Next ", " F3 " },
{ " Compile ", " F9 " },
{ " Build ", " F5 " },
{ " Copy ", " Ctrl+C " },
{ " Cut ", " Ctrl+X " },
{ " Paste ", " Ctrl+Y " },
{ " Help ", " Ctrl+H " }, };
// 用表头和数据构造一个表
JTable help_Table = new JTable(data, field);
help_Table.setFont(font);
//不可编辑帮助信息表
help_Table.setEnabled(false);
// 为表和文本域设置背景和前景颜色
helpTextArea.setFont(new Font("Courier", Font.TRUETYPE_FONT, 16));
helpFrame.getContentPane().setLayout(new BorderLayout());
help_Table.setForeground(Color.pink);
helpTextArea.setForeground(Color.pink);
help_Table.setBackground(new Color(70, 80, 91));
help_Table.setSelectionBackground(new Color(70, 80, 91));
helpTextArea.setBackground(new Color(70, 80, 91));
helpTextArea.setText(" If you want to use this software with all functions,\n"
+ " You must do the things following:\n"
+ " 1: install jdk_1.3 or Higher than it ;\n"
+ " 2: set your classpath and path correctly;\n"
+ " 3: if you want to use the compile and build functions,\n"
+ " you should save your edited File in the save directory\n"
+ " with this software.\n ");
// 将文本域和表加到窗体中
helpFrame.getContentPane().add(
new JScrollPane(help_Table,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER);
helpFrame.getContentPane().add(
new JScrollPane(helpTextArea,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.NORTH);
}
// 退出编辑器
private void exitEditor(){
// 弹出一个选择确认对话框,请求确认退出
if ((JOptionPane.showConfirmDialog(this, "你确定文本编辑器?", "退出",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)){
// 如果选择YES,则退出。
//dispose方法用于释放资源
//释放由此 Window、其子组件及其拥有的所有子组件所使用的所有本机屏幕资源。
//即这些 Component 的资源将被破坏,它们使用的所有内存都将返回到操作系统,并将它们标记为不可显示。
//通过随后对 pack 或 show 的调用重新构造本机资源,可以再次显示 Window 及其子组件。
//重新创建的 Window 及其子组件的状态在移除 Window 的点上与这些对象的状态将是一样的(不考虑这些操作之间的其他更改)。
dispose();
System.exit(0);
}
}
/**
* 键盘事件处理器
*/
public class MyKeyListener extends KeyAdapter {
// 覆盖父类的keyPressed方法,处理键被按下时的事件。
public void keyPressed(KeyEvent e) {
// 按F12打开文件
if (e.getKeyCode() == KeyEvent.VK_F12){
(new Act_OpenFile()).actionPerformed(null);
}
// 按Ctrl加S键保存文件
else if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_S){
(new Act_SaveFile()).actionPerformed(null);
}
// 按Alt键查找
else if (e.isAltDown()){
(new Act_Find()).actionPerformed(null);
}
// 按F3查找下一个
else if (e.getKeyCode() == KeyEvent.VK_F3){
(new Act_FindNext()).actionPerformed(null);
}
// 按F4替换
else if (e.getKeyCode() == KeyEvent.VK_F4){
(new Act_Replace()).actionPerformed(null);
}
// 按Ctrl加N新建文件
else if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_N){
(new Act_NewFile()).actionPerformed(null);
}
// 按Ctrl加E退出编辑器
else if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_E){
(new Act_ExitEditor()).actionPerformed(null);
}
// 按F5运行Java程序
else if (e.getKeyCode() == KeyEvent.VK_F5){
(new Act_Build()).actionPerformed(null);
}
// 按F9编译Java源代码
else if (e.getKeyCode() == KeyEvent.VK_F9){
(new Act_Compile()).actionPerformed(null);
}
// 按Ctrl加H显示帮助
else if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_H){
(new Act_Help()).actionPerformed(null);
}
}
}
/**
* 窗口事件侦听器
*/
public class WindowListener extends WindowAdapter {
// 处理关闭窗口事件
public void windowClosing(WindowEvent e) {
exitEditor();
}
}
/**
* 文件选择器
*/
class FileChooser extends JFileChooser {
public FileChooser() {
//文件选择器默认位置为当前文件夹
super("./");
}
/**
* 提交选择
*/
public void approveSelection() {
String filename = null;
//fileChooser_control == 0表示现在是打开文件,需要读
if (fileChooser_control == 0) {
//打开文件时,在左边的树中添加一个节点
root.add(nodes[tb]);
remove(tree);
tree = new JTree(root);
tree.setBackground(new Color(70, 80, 91));
treeFlashSplitPane.setRightComponent(tree);
treeFlashSplitPane.setDividerLocation(120);
// 新建一个tab页,用于装新打开的文件
fileTabbedPane.addTab("File" + (tb + 1), fileScrollPanes[tb]);
fileTabbedPane.setSelectedIndex(tb);
//将当前文本域设置到新打开的文件上
textAreas_control = tb;
tb++;
//获取待打开的文件名
filename = fileChooser.getSelectedFile().getName();
//获取待打开的文件所在的目录,将目录保存至数组,这样在保存文件的时候,能够将文件名保存到目录中
directory[textAreas_control] = fileChooser.getCurrentDirectory().toString();
fileTextAreas[textAreas_control].setText(null);
try {
//将文件内容显示到文本域中
String str;
BufferedReader breader = new BufferedReader(new FileReader(
directory[textAreas_control] + "/" + filename));
while (true) {
str = breader.readLine();
if (str == null) {
break;
}
fileTextAreas[textAreas_control].append(str + '\n');
}
} catch (Exception e_open) {
JOptionPane
.showMessageDialog(dialogFrame.getContentPane(), "读取发生错误");
}
} else if (fileChooser_control == 1) {
// fileChooser_control == 1表示现在是保存新文件,需要写
filename = fileChooser.getSelectedFile().getName();
directory[textAreas_control] = fileChooser.getCurrentDirectory().toString();
try {
//将文本域中的内容写到文件中
fileWriter = new FileWriter(directory[textAreas_control] + "/"
+ filename);
fileWriter.write(fileTextAreas[textAreas_control].getText());
fileWriter.close();
} catch (Exception e_save) {
JOptionPane
.showMessageDialog(dialogFrame.getContentPane(), "读取发生错误");
}
}
//关闭对话框
dialogFrame.dispose();
//更新文件目录树中的名字
root.remove(nodes[textAreas_control]);
nodes[textAreas_control] = new DefaultMutableTreeNode(filename);
root.add(nodes[textAreas_control]);
//将当前显示的树删除、显示新的树
remove(tree);
tree = new JTree(root);
tree.setBackground(new Color(70, 80, 91));
treeFlashSplitPane.setRightComponent(tree);
treeFlashSplitPane.setDividerLocation(120);
//将tab页的标题改为文件名
fileTabbedPane.setTitleAt(textAreas_control, filename);
//无论是打开、还是保存,这个文件不是已经新建的,所以置为false
newFileFlags[textAreas_control] = false;
}
/**
* 取消选择
*/
public void cancelSelection() {
dialogFrame.dispose();
}
}
/**
* 文件过滤器,只支持编辑".java,*.html,*.txt,*.cpp"文件
*/
class Filter extends FileFilter {
// 覆盖FileFilter的accept方法
public boolean accept(File file1) {
return (file1.getName().endsWith(".java") || file1.isDirectory()
|| file1.getName().endsWith(".html")
|| file1.getName().endsWith(".txt") || file1.getName()
.endsWith(".cpp"));
}
public String getDescription() {
return (".java,*.html,*.txt,*.cpp");
}
}
/**
* 用于侦听文本组件插入符的位置更改的侦听器
* 获取当前光标在文件中的行号
*/
class CaretLis_lineNo implements CaretListener {
public void caretUpdate(CaretEvent e) {
try {
showLineNoTextArea.setText(" Cursor at the "
+ (fileTextAreas[textAreas_control]
.getLineOfOffset(fileTextAreas[textAreas_control]
.getCaretPosition()) + 1)
+ " line in the file of "
+ fileTabbedPane.getTitleAt(textAreas_control));
} catch (BadLocationException eB) {
System.out.println("IO Wrong");
}
}
}
/**
* 控制台文本域中鼠标事件的侦听器
* 当控制台中有错误信息时,表明Java源文件编译有问题,定位到出错的行号。
*/
class MouseListener_console extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
// 获取光标在控制台文本域中的位置
int off_err = consoleTextArea.getCaretPosition();
int line_no = 0;
try {
// 根据光标位置,定位它在控制台文本域中的行
int index = -1;
int line_err = consoleTextArea.getLineOfOffset(off_err - 1);
// 获取光标所在行的起始字符在文本域中的位置
int start_err = consoleTextArea.getLineStartOffset(line_err);
// 获取光标所在行的起始位置到光标位置之间文本,即错误信息
String err_str = consoleTextArea.getText(start_err, off_err - start_err);
// 高亮显示错误信息
consoleTextArea.select(start_err, off_err);
// 分析错误信息中是否有编译器指出的Java源文件行号,这里假定最多10000行源程序
for (line_no = 0; line_no < 10000; line_no++) {
index = err_str.indexOf(":" + line_no + ":");
if (index > 0) {
break;
}
}
// 如果能够分析出Java源文件的行号,则在文件文本域中高亮显示。
if (index != -1) {
fileTextAreas[textAreas_control].requestFocus();
fileTextAreas[textAreas_control].select(fileTextAreas[textAreas_control]
.getLineStartOffset(line_no - 1), fileTextAreas[textAreas_control]
.getLineEndOffset(line_no - 1));
}
} catch (BadLocationException eB) {
System.out.println("IO Wrong");
}
}
}
/**
* 切换tab页事件
*/
class Act_ChangeTab implements ChangeListener {
public void stateChanged(ChangeEvent e) {
// 切换tab页时,更新textAreas_control的值。
textAreas_control = fileTabbedPane.getSelectedIndex();
}
}
/**
* 新建文件事件
*/
class Act_NewFile implements ActionListener {
public void actionPerformed(ActionEvent e_ji0) {
//建立新文件时,更新树和tab页。
root.add(nodes[tb]);
remove(tree);
tree = new JTree(root);
tree.setBackground(new Color(70, 80, 91));
treeFlashSplitPane.setRightComponent(tree);
treeFlashSplitPane.setDividerLocation(120);
fileTabbedPane.addTab("File" + (tb + 1), fileScrollPanes[tb]);
fileTabbedPane.setSelectedIndex(tb);
textAreas_control = tb;
tb++;
}
}
/**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -