⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simpleeditor.java

📁 JDK实例宝典代码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		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 + -