用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

文本编辑器(能编辑html、java、cpp、txt文件,java编译与运行)

2012-11-24 作者: 程序猿style举报

[java]代码库

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.JTree;
import javax.swing.Timer;
import javax.swing.border.BevelBorder;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.text.BadLocationException;
import javax.swing.tree.DefaultMutableTreeNode;

/**
 * 一个简单的文本编辑器,能够编辑html、java、cpp、txt文件, 并支持java的编译与运行
 */
public class SimpleEditor extends JFrame {

	/******** 菜单栏、菜单和菜单项 *********/
	JMenuBar menuBar = new JMenuBar();
	JMenu fileMenu = new JMenu("File");
	JMenu optionMenu = new JMenu("Option");
	JMenu advanceMenu = new JMenu("Advance");
	JMenu helpMenu = new JMenu("Help");
	JMenu editMenu = new JMenu("Edit");
	JMenuItem newMenuItem = new JMenuItem("new");
	JMenuItem openMenuItem = new JMenuItem("Open");
	JMenuItem saveMenuItem = new JMenuItem("Save");
	JMenuItem exitMenuItem = new JMenuItem("exit");
	JMenuItem findMenuItem = new JMenuItem("Find");
	JMenuItem findNextMenuItem = new JMenuItem("Find Next");
	JMenuItem replaceMenuItem = new JMenuItem("Replace");
	JMenuItem compileMenuItem = new JMenuItem("Compile");
	JMenuItem buildMenuItem = new JMenuItem("Build");
	JMenuItem stopFlashMenuItem = new JMenuItem("Stop Flash");
	JMenuItem startFlashMenuItem = new JMenuItem("Start Flash");
	JMenuItem helpMenuItem = new JMenuItem("Help");
	JMenuItem copyMenuItem = new JMenuItem("Copy");
	JMenuItem cutMenuItem = new JMenuItem("Cut");
	JMenuItem pasteMenuItem = new JMenuItem("Paste");

	/******** 文件内容的显示 ****/
	// 用多个文本域存放多个文件内容,文本域放在JScrollPane里
	// 而JScrollPane放在JTabbedPane中,这就是一个多页面的布局

	// 多个文本域,每个文本域显示一个文件的内容
	JTextArea[] fileTextAreas = new JTextArea[10];
	// 编译或者运行时的控制台信息
	JTextArea consoleTextArea = new JTextArea();
	JScrollPane[] fileScrollPanes = new JScrollPane[10];
	JScrollPane consoleScrollPane;
	// 多个文本域放在不同tab里
	JTabbedPane fileTabbedPane = new JTabbedPane();

	/********** 工具栏以及工具栏上的按钮 **********/
	JToolBar toolBar = new JToolBar();
	JButton openButton = new JButton(new ImageIcon(loadImage("image/open.gif")));
	JButton newButton = new JButton(new ImageIcon(loadImage("image/new.gif")));
	JButton saveButton = new JButton(new ImageIcon(loadImage("image/save.gif")));
	JButton helpButton = new JButton(new ImageIcon(loadImage("image/help.gif")));
	JButton exitButton = new JButton(
			new ImageIcon(loadImage("image/close.gif")));
	JButton compileButton = new JButton(new ImageIcon(
			loadImage("image/compile.gif")));
	JButton buildButton = new JButton(new ImageIcon(
			loadImage("image/build.gif")));
	JButton copyButton = new JButton(new ImageIcon(loadImage("image/copy.gif")));
	JButton cutButton = new JButton(new ImageIcon(loadImage("image/cut.gif")));
	JButton pasteButton = new JButton(new ImageIcon(
			loadImage("image/paste.gif")));

	// 该文本域显示当前光标在当前文本域中的行号
	JTextArea showLineNoTextArea = new JTextArea();
	// 对话框窗体,程序中所有对话框都显示在该窗体中
	JFrame dialogFrame = new JFrame();

	/***** 文件名以树型结构在左边显示 *******/
	JTree tree;
	DefaultMutableTreeNode root;
	DefaultMutableTreeNode[] nodes = new DefaultMutableTreeNode[10];

	/******* 组件之间的分隔栏 ******/
	JSplitPane leftRightSplitPane;
	JSplitPane lineNoConsoleSplitPane;
	JSplitPane treeFlashSplitPane;
	JSplitPane tabbedLineNoSplitPane;

	/********** 文件选择、存储相关 ********/
	// 文件过滤器
	Filter fileFilter = new Filter();
	// 文件选择器
	FileChooser fileChooser = new FileChooser();
	// 文件读写控制,0表示文件选择器读文件,1文件选择器标示写文件
	int fileChooser_control = 0;
	FileWriter fileWriter;

	// tabbedPane中tab页的当前数量
	int tb = 1;
	int find_control = 0;
	// 文本域的控制器,指向当前操作的文本域
	int textAreas_control = 0;
	// 当前文本域中的文本
	String currentTextInTextArea;

	// 标志文件是否为新建的,如果是新建的文件,为true
	boolean[] newFileFlags = new boolean[10];
	// 存放打开文件所在的目录
	String[] directory = new String[10];

	/******** 查找替换相关 ****/
	// 正在查找的字符串及其长度
	String findWord;
	int fingWordLength;
	// 保存正在查找的字符串在文本域中的文本的位置
	int findIndex;
	// 被替换的文本的长度
	int replaceLength = 0;

	/******** 用于显示Flash的控制器 ****/
	JLabel flashLabel = new JLabel(new ImageIcon(
			loadImage("image/Juggler0.gif")));
	Timer timer = new Timer(100, new Act_timer());
	int timerControl = 0;

	/******** 帮助相关 ****/
	Font font = new Font("Courier", Font.TRUETYPE_FONT, 14);
	JTextArea helpTextArea = new JTextArea();
	JFrame helpFrame = new JFrame("Help");

	// 构造函数
	public SimpleEditor() {
		super("文本编辑器");

		// 为窗体添加键盘事件处理器
		// 下面这一行非常重要,表示窗体能够接受焦点。
		// 如果没有这一句,按键盘会无效。
		this.setFocusable(true);
		this.addKeyListener(new MyKeyListener());

		// 为窗体添加窗口事件处理器
		this.addWindowListener(new WindowListener());

		// 初始化
		init();
		setLocation(200, 200);
		setVisible(true);
		pack();
		// 初始时启动动画
		timer.start();
	}

	private void init() {

		/******* 初始化文本域、目录、树节点 *********/
		for (int i = 0; i < 10; i++) {
			nodes[i] = new DefaultMutableTreeNode("File" + (i + 1));
			newFileFlags[i] = true;
			fileTextAreas[i] = new JTextArea();
			// 设置文本域中文本的字体
			fileTextAreas[i].setFont(font);
			// 为文本域的插入光标设置颜色
			fileTextAreas[i].setCaretColor(Color.yellow);
			// 设置文本域的背景和前景颜色
			fileTextAreas[i].setBackground(new Color(70, 80, 91));
			fileTextAreas[i].setForeground(Color.pink);
			// 为文本域插入光标设置事件处理器
			fileTextAreas[i].addCaretListener(new CaretLis_lineNo());
			// 为文本域键盘设置事件处理器
			fileTextAreas[i].addKeyListener(new MyKeyListener());
			directory[i] = new String("/");
			fileScrollPanes[i] = new JScrollPane(fileTextAreas[i],
					JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
					JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		}
		root = new DefaultMutableTreeNode("正在编辑的文件");
		root.add(nodes[0]);
		tree = new JTree(root);
		tree.setEditable(false);
		tree.setForeground(new Color(200, 150, 10));
		tree.setBackground(new Color(70, 80, 91));

		// 初始化控制台文本域
		consoleTextArea.setFont(font);
		consoleScrollPane = new JScrollPane(consoleTextArea,
				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		consoleTextArea.setForeground(new Color(200, 150, 10));
		consoleTextArea.setBackground(new Color(70, 80, 91));
		consoleTextArea.addMouseListener(new MouseListener_console());

		// 初始化显示当前光标行数的文本域
		showLineNoTextArea.setEnabled(false);
		showLineNoTextArea.setFont(font);
		showLineNoTextArea.setBackground(new Color(70, 80, 91));
		showLineNoTextArea.setDisabledTextColor(Color.yellow);

		/************** 初始化菜单 *************/
		// 初始化菜单项
		newMenuItem.addActionListener(new Act_NewFile());
		openMenuItem.addActionListener(new Act_OpenFile());
		saveMenuItem.addActionListener(new Act_SaveFile());
		exitMenuItem.addActionListener(new Act_ExitEditor());
		findMenuItem.addActionListener(new Act_Find());
		findNextMenuItem.addActionListener(new Act_FindNext());
		replaceMenuItem.addActionListener(new Act_Replace());
		compileMenuItem.addActionListener(new Act_Compile());
		buildMenuItem.addActionListener(new Act_Build());
		helpMenuItem.addActionListener(new Act_Help());
		copyMenuItem.addActionListener(new Act_Copy());
		cutMenuItem.addActionListener(new Act_Cut());
		pasteMenuItem.addActionListener(new Act_Paste());
		stopFlashMenuItem.addActionListener(new Act_StopFlash());
		startFlashMenuItem.addActionListener(new Act_StartFlash());
		startFlashMenuItem.setEnabled(false);
		// 初始化菜单
		fileMenu.add(newMenuItem);
		fileMenu.add(openMenuItem);
		fileMenu.add(saveMenuItem);
		fileMenu.add(exitMenuItem);
		optionMenu.add(findMenuItem);
		optionMenu.add(findNextMenuItem);
		optionMenu.add(replaceMenuItem);
		advanceMenu.add(compileMenuItem);
		advanceMenu.add(buildMenuItem);
		advanceMenu.addSeparator();
		advanceMenu.add(stopFlashMenuItem);
		advanceMenu.add(startFlashMenuItem);
		helpMenu.add(helpMenuItem);
		editMenu.add(copyMenuItem);
		editMenu.add(cutMenuItem);
		editMenu.add(pasteMenuItem);
		// 初始化菜单栏
		menuBar.add(fileMenu);
		menuBar.add(optionMenu);
		menuBar.add(advanceMenu);
		menuBar.add(editMenu);
		menuBar.add(helpMenu);
		// 将菜单栏添加到窗体中
		setJMenuBar(menuBar);

		/*********** 初始化工具栏以及按钮 **********/
		// 初始化按钮
		newButton.addActionListener(new Act_NewFile());
		openButton.addActionListener(new Act_OpenFile());
		saveButton.addActionListener(new Act_SaveFile());
		exitButton.addActionListener(new Act_ExitEditor());
		compileButton.addActionListener(new Act_Compile());
		buildButton.addActionListener(new Act_Build());
		helpButton.addActionListener(new Act_Help());
		copyButton.addActionListener(new Act_Copy());
		cutButton.addActionListener(new Act_Cut());
		pasteButton.addActionListener(new Act_Paste());
		// 为工具栏设置提示信息,当鼠标在工具栏按钮上停留一段时间时,会显示提示信息
		newButton.setToolTipText("New");
		openButton.setToolTipText("Open");
		saveButton.setToolTipText("Save");
		exitButton.setToolTipText("Exit");
		helpButton.setToolTipText("Help");
		compileButton.setToolTipText("Compile");
		buildButton.setToolTipText("Build");
		copyButton.setToolTipText("Copy");
		cutButton.setToolTipText("Cut");
		pasteButton.setToolTipText("Paste");
		newButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		openButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		saveButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		exitButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		helpButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		compileButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		buildButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		cutButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		copyButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		pasteButton.setBorder(new BevelBorder(BevelBorder.RAISED));
		// 初始化工具栏
		toolBar.add(newButton);
		toolBar.add(openButton);
		toolBar.add(saveButton);
		toolBar.add(copyButton);
		toolBar.add(cutButton);
		toolBar.add(pasteButton);
		toolBar.add(compileButton);
		toolBar.add(buildButton);
		toolBar.add(exitButton);
		toolBar.add(helpButton);

		/******** 初始化tab页面板和组件间的分隔栏 *********/
		fileTabbedPane.addTab("File1", fileScrollPanes[0]);
		fileTabbedPane.addChangeListener(new Act_ChangeTab());
		// 文件目录树和Flash之间的分隔栏
		treeFlashSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true,
				flashLabel, tree);
		// 文件文本域面板与指示光标所在行文本域面板之间的分隔栏
		tabbedLineNoSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true,
				fileTabbedPane, showLineNoTextArea);
		// 右边上2个面板与控制台面板的分隔栏
		lineNoConsoleSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
				true, tabbedLineNoSplitPane, consoleScrollPane);
		// 左边大面板与右边大面板之间的分隔栏
		leftRightSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true,
				treeFlashSplitPane, lineNoConsoleSplitPane);
		// 设置分隔栏两边面板显示的宽度,如果分割条是左右分割,则参数表示分割条的横坐标
		// 如果分割条是上下分割,则参数表示分割条的纵坐标
		leftRightSplitPane.setDividerLocation(150);
		tabbedLineNoSplitPane.setDividerLocation(460);
		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++;
		}
	}

	/**
	 * 打开文件事件
	 */
	class Act_OpenFile implements ActionListener {
		public void actionPerformed(ActionEvent e_ji1) {
			// 打开已有文件
			// 将文件选择器置为打开文件状态
			fileChooser_control = 0;
			fileChooser.setApproveButtonText("打开");
			fileChooser.addChoosableFileFilter(fileFilter);
			dialogFrame.getContentPane().add(fileChooser);
			dialogFrame.setSize(550, 350);
			dialogFrame.setTitle("请选择要打开的文件!");
			dialogFrame.setVisible(true);
			fileTextAreas[textAreas_control].setCaretPosition(0);
		}
	}

	/**
	 * 保存文件事件
	 */
	class Act_SaveFile implements ActionListener {
		public void actionPerformed(ActionEvent e_ji2) {
			System.out.println("Act_SaveFile" + textAreas_control);
			if (newFileFlags[textAreas_control]) {
				// 对于新建的文件,需要指定文件存储路径,因此调用了文件选择起存储文件
				// 将文件选择器置为保存文件状态
				fileChooser_control = 1;
				fileChooser.setApproveButtonText("保存");
				fileChooser.addChoosableFileFilter(fileFilter);
				dialogFrame.getContentPane().add(fileChooser);
				dialogFrame.setTitle("请输入文件名!");
				dialogFrame.setSize(550, 350);
				dialogFrame.setVisible(true);

			} else {
				try {
					// 对于已经存在的文件,直接保存
					// 写文件,将当前文本域中文本写入到文件。
					fileWriter = new FileWriter(directory[textAreas_control]
							+ "/"
							+ fileTabbedPane.getTitleAt(textAreas_control));
					fileWriter
							.write(fileTextAreas[textAreas_control].getText());
					fileWriter.close();
				} catch (Exception e_save) {
					JOptionPane.showMessageDialog(null, "读取发生错误");
				}
			}
		}
	}

	/**
	 * 退出编辑器事件
	 */
	class Act_ExitEditor implements ActionListener {
		public void actionPerformed(ActionEvent e_ji3) {
			// 退出编辑器
			exitEditor();
		}
	}

	/**
	 * 查找事件
	 */
	class Act_Find implements ActionListener {
		public void actionPerformed(ActionEvent e_ji4) {
			// 查找对话框
			findWord = JOptionPane.showInputDialog("请输入查找内容");
			if (findWord == null) {
				JOptionPane.showMessageDialog(null, "查找失败!");
			} else {
				// 根据查找内容在当前文本域中进行匹配
				fingWordLength = findWord.length();
				currentTextInTextArea = fileTextAreas[textAreas_control]
						.getText();
				findIndex = currentTextInTextArea.indexOf(findWord);
				if (findIndex < 0) {
					JOptionPane.showMessageDialog(null, "   查找内容不存在  ");
				} else {
					// 如果找到了,则将鼠标键盘焦点放在当前文本域中,并将匹配字符串标示出来
					fileTextAreas[textAreas_control].requestFocus();
					fileTextAreas[textAreas_control].select(findIndex,
							findIndex + fingWordLength);
				}
			}
		}
	}

	/**
	 * 查找下一个事件
	 */
	class Act_FindNext implements ActionListener {
		public void actionPerformed(ActionEvent e_ji4_next) {
			// 查找下一个匹配的字符串
			currentTextInTextArea = fileTextAreas[textAreas_control].getText();
			findIndex = currentTextInTextArea.indexOf(findWord, findIndex + 1);
			if (findIndex < 0) {
				JOptionPane.showMessageDialog(null, " 查找已经到达文件尾! ");
			} else {
				fileTextAreas[textAreas_control].select(findIndex, findIndex
						+ fingWordLength);
			}
		}
	}

	/**
	 * 替换事件
	 */
	class Act_Replace implements ActionListener {
		public void actionPerformed(ActionEvent e_ji5) {
			// 替换对话框
			Object[] endButton1 = { "Replace", "Cancel" };
			String message1 = "确认替换?";
			currentTextInTextArea = fileTextAreas[textAreas_control].getText();

			// 获取被替换的内容
			String seek_word = JOptionPane.showInputDialog("请输入查找内容");
			// 获取替换后的内容
			String replace_word = JOptionPane.showInputDialog("请输入替换内容");
			// 如果用户输入的查找内容不为null,则开始进行替换操作
			if (seek_word != null) {
				// 获取查找内容的长度,也就是将来替换的长度
				replaceLength = seek_word.length();
				while (true) {
					// 先获取当前文本域的文本,再进行查找
					currentTextInTextArea = fileTextAreas[textAreas_control]
							.getText();
					findIndex = currentTextInTextArea.indexOf(seek_word,
							findIndex + replaceLength);
					if (findIndex < 0) {
						// 文本中不存在查找内容
						JOptionPane.showMessageDialog(null, "查找已经到达文件尾!");
						break;
					} else {
						// 查找成功,则标示出查找内容
						fileTextAreas[textAreas_control].requestFocus();
						fileTextAreas[textAreas_control].select(findIndex,
								findIndex + replaceLength);
						// 替换确认
						JOptionPane end1 = new JOptionPane(message1,
								JOptionPane.WARNING_MESSAGE,
								JOptionPane.DEFAULT_OPTION, null, endButton1);
						JDialog endD1 = end1.createDialog(end1, "请选择");
						endD1.setVisible(true);
						Object push1 = end1.getValue();
						if (push1 == endButton1[0]) {
							// 如果用户选择替换,则将文本域中被标示的文字用replace替换
							fileTextAreas[textAreas_control]
									.replaceSelection(replace_word);
						}
					}
				}
			}
		}
	}

	/**
	 * 编译compile事件
	 */
	class Act_Compile implements ActionListener {
		public void actionPerformed(ActionEvent e_ji6) {
			// compile一个java源文件
			// 控制台信息
			consoleTextArea.setText(null);
			// 目前只支持编译java类
			if ((fileTabbedPane.getTitleAt(textAreas_control)).indexOf(".java") > -1) {
				try {
					int count;
					byte input[] = new byte[256];
					String InputString;
					// 编译java源文件的命令"javac"
					String[] command = {
							"javac",
							directory[textAreas_control]
									+ "/"
									+ fileTabbedPane
											.getTitleAt(textAreas_control) };
					// 当前应用程序启动一个新进程,用于执行命令
					Process p = Runtime.getRuntime().exec(command);
					// 读取执行命令时的错误输出
					BufferedInputStream bufin = new BufferedInputStream(
							p.getErrorStream());
					// 这里仅仅读取前1024个字节
					bufin.mark(1024);
					count = bufin.read(input);
					if (count <= 0) {
						// 编译没有错误
						consoleTextArea.append("Compile to "
								+ fileTabbedPane.getTitleAt(textAreas_control)
								+ " Success");
					} else {
						// 编译失败
						InputString = new String(input, 0, count);
						consoleTextArea.append("Compile to "
								+ fileTabbedPane.getTitleAt(textAreas_control)
								+ " Fail\n" + InputString);
					}
				} catch (IOException e) {
					System.err.println("IO error: " + e);
				}
			} else {
				consoleTextArea.append(fileTabbedPane
						.getTitleAt(textAreas_control)
						+ " is not a java File !\n Please Check it again!");
			}
		}
	}

	/**
	 * 运行build事件
	 */
	class Act_Build implements ActionListener {
		public void actionPerformed(ActionEvent e_ji7) {
			// build一个Java类
			consoleTextArea.setText(null);
			if ((fileTabbedPane.getTitleAt(textAreas_control)).indexOf(".java") > -1) {
				try {
					int count;
					byte input[] = new byte[256];
					String InputString;
					// 获取java类的名字,去掉java源文件名的后五个字母".java"
					String class_name;
					int length = (fileTabbedPane.getTitleAt(textAreas_control))
							.length();
					class_name = (fileTabbedPane.getTitleAt(textAreas_control))
							.substring(0, length - 5);
					// 运行java类的命令"java"
					String[] command = { "java", "-classpath",
							directory[textAreas_control], class_name };
					Process p = Runtime.getRuntime().exec(command);
					BufferedInputStream bufin = new BufferedInputStream(
							p.getErrorStream());
					bufin.mark(256);
					count = bufin.read(input);
					if (count <= 0) {
						// 运行没有错误
						consoleTextArea.append("Build to "
								+ fileTabbedPane.getTitleAt(textAreas_control)
								+ " Success");
					} else {
						// 运行有错误
						InputString = new String(input, 0, count);
						consoleTextArea.append("Builld to "
								+ fileTabbedPane.getTitleAt(textAreas_control)
								+ " Fail\n" + InputString);
					}
				} catch (IOException e) {
					System.err.println("IO error: " + e);
				} catch (IndexOutOfBoundsException e2) {
					System.err.println("IO error: " + e2);
				}
			} else {
				consoleTextArea.append(fileTabbedPane
						.getTitleAt(textAreas_control)
						+ " is not a java File !\n Please Check it again!");
			}
		}
	}

	/**
	 * 显示帮助Help事件
	 */
	class Act_Help implements ActionListener {
		public void actionPerformed(ActionEvent e_ji9) {
			helpFrame.pack();
			helpFrame.setVisible(true);
			helpFrame.requestFocus();
			helpFrame.setLocation(200, 0);
		}
	}

	class Act_Copy implements ActionListener {
		public void actionPerformed(ActionEvent e_ji9) {
			// 复制事件,直接调用JTextArea的copy方法
			fileTextAreas[textAreas_control].copy();
		}
	}

	class Act_Cut implements ActionListener {
		public void actionPerformed(ActionEvent e_ji10) {
			// 剪贴事件,直接调用JTextArea的cut方法
			fileTextAreas[textAreas_control].cut();
		}
	}

	class Act_Paste implements ActionListener {
		public void actionPerformed(ActionEvent e_ji11) {
			// 粘贴事件,直接调用JTextArea的paste方法
			fileTextAreas[textAreas_control].paste();
		}
	}

	/**
	 * 动画显示事件
	 */
	class Act_timer implements ActionListener {
		public void actionPerformed(ActionEvent e_time) {
			// Flash显示,一共就4个图片文件,按顺序显示
			if (timerControl > 4) {
				timerControl = 0;
			}
			flashLabel.setIcon(new ImageIcon(loadImage("image/Juggler"
					+ timerControl + ".gif")));
			timerControl++;
		}
	}

	/**
	 * 停止动画事件
	 */
	class Act_StopFlash implements ActionListener {
		public void actionPerformed(ActionEvent E_stop) {
			// Flash控制。停止动画
			timer.stop();
			startFlashMenuItem.setEnabled(true);
			stopFlashMenuItem.setEnabled(false);
		}
	}

	/**
	 * 启动动画事件
	 */
	class Act_StartFlash implements ActionListener {
		public void actionPerformed(ActionEvent E_start) {
			// Flash控制。启动动画
			timer.start();
			startFlashMenuItem.setEnabled(false);
			stopFlashMenuItem.setEnabled(true);
		}
	}

	/**
	 * 从jar包中读取图片文件
	 * 
	 * @param name
	 * @return 返回一个图片对象
	 */
	private java.awt.Image loadImage(String name) {
		try {
			java.net.URL url = getClass().getResource(name);
			// 根据URL中内容新建一个图片文件
			return createImage((java.awt.image.ImageProducer) url.getContent());
		} catch (Exception ex) {
			return null;
		}
	}

	public static void main(String args[]) {
		new SimpleEditor();
	}
}

[代码运行效果截图]


文本编辑器(能编辑html、java、cpp、txt文件,java编译与运行)


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...