文本编辑器——记事本类型的应用,可以打开、编辑、保存文本文档。可以增加单词高亮和其它的一些特性


import java.awt.*;

import java.awt.event.*;

import java.io.*;

import javax.swing.*;

import javax.swing.text.*;

 

//简单的文本编辑器

 

public class Editor extends JFrame {

	public JTextPane textPane = new MyTextPane(); //文本窗格d,编辑窗口

	public JFileChooser filechooser = new JFileChooser(); //文件选择器

 

	public Editor()

	{

		super("编辑器");

		

		Action[] actions=			//菜单项的各种功能

			{

					new NewAction(),

					new OpenAction(),

					new SaveAction(),

					new CutAction(),

					new CopyAction(),

					new PasteAction(),

					new AboutAction(),

					new ExitAction(),

					new HelpAction()

			};

		setJMenuBar(createJMenuBar(actions));		//根据actions创建菜单栏

		Container container=getContentPane();		

		container.add(textPane, BorderLayout.CENTER);

		

		setSize(1300,1500);

		setVisible(true);

	//	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}

 

	private JMenuBar createJMenuBar(Action[] actions)	//创建菜单栏的函数

	{

		JMenuBar menubar=new JMenuBar();

		JMenu menuFile=new JMenu("文件(F)");

		JMenu menuEdit=new JMenu("编辑(E)");

		JMenu menuAbout=new JMenu("帮助(H)");

		menuFile.add(new JMenuItem(actions[0]));

		menuFile.add(new JMenuItem(actions[1]));

		menuFile.add(new JMenuItem(actions[2]));

		menuFile.add(new JMenuItem(actions[7]));

		menuEdit.add(new JMenuItem(actions[3]));

		menuEdit.add(new JMenuItem(actions[4]));

		menuEdit.add(new JMenuItem(actions[5]));

		menuAbout.add(new JMenuItem(actions[6]));

		menuAbout.add(new JMenuItem(actions[8]));

		menubar.add(menuFile);

		menubar.add(menuEdit);

		menubar.add(menuAbout);

		return menubar;

	}

 

	class NewAction extends AbstractAction		//新建

	{

		public NewAction()

		{

			super("新建(N)     Ctrl+N");

		}

		public void actionPerformed(ActionEvent e)

		{

			textPane.setDocument(new DefaultStyledDocument());

		}

	}

 

	class OpenAction extends AbstractAction		//打开

	{

		public OpenAction()

		{

			super("打开(O)     Ctrl+O");

		}

		public void actionPerformed(ActionEvent e)

		{

			int i=filechooser.showOpenDialog(Editor.this);			//显示打开文件对话框

			if(i==JFileChooser.APPROVE_OPTION)			//点击对话框打开选项

			{

				File f=filechooser.getSelectedFile();	//得到选择的文件

				try

				{

					InputStream is=new FileInputStream(f);

					textPane.read(is, "d");

				}

				catch(Exception ex)

				{

					ex.printStackTrace();

				}

			}

		}

	}

 

	class SaveAction extends AbstractAction		//保存

	{

		public SaveAction()

		{

			super("保存(S)     Ctrl+S");

		}

		public void actionPerformed(ActionEvent e)

		{

			int i=filechooser.showSaveDialog(Editor.this);

			if(i==JFileChooser.APPROVE_OPTION)

			{

				File f=filechooser.getSelectedFile();

				try

				{

					FileOutputStream out=new FileOutputStream(f);

					out.write(textPane.getText().getBytes());

				}

				catch(Exception ex)

				{

					ex.printStackTrace();

				}

			}

		}

	}

 

	class ExitAction extends AbstractAction		//退出

	{

		public ExitAction()

		{

			super("退出(X)");

		}

		public void actionPerformed(ActionEvent e)

		{

			dispose();

		}

	}

 

	class CutAction extends AbstractAction		//剪切

	{

		public CutAction()

		{

			super("剪切(T)     Ctrl+X");

		}

		public void actionPerformed(ActionEvent e)

		{

			textPane.cut();

		}

	}

	

	class CopyAction extends AbstractAction		//复制

	{

		public CopyAction()

		{

			super("复制(C)     Ctrl+C");

		}

		public void actionPerformed(ActionEvent e)

		{

			textPane.copy();

		}

	}

 

	class PasteAction extends AbstractAction		//粘贴

	{

		public PasteAction()

		{

			super("粘贴(P)     Ctrl+V");

		}

		public void actionPerformed(ActionEvent e)

		{

			textPane.paste();

		}

	}

 

	class AboutAction extends AbstractAction

	{

		public AboutAction()

		{

			super("关于简记(A)");

		}

		public void actionPerformed(ActionEvent e)

		{

			JOptionPane.showMessageDialog(Editor.this,"实现了记事本的一些基本功能","关于",JOptionPane.PLAIN_MESSAGE);

		}

	}

	

	class HelpAction extends AbstractAction

	{

		public HelpAction()

		{

			super("联系开发者");

		}

		public void actionPerformed(ActionEvent e)

		{

			JOptionPane.showMessageDialog(Editor.this,"cpeng2424@gmail.com","开发者邮箱",JOptionPane.PLAIN_MESSAGE);

		}

	}

	

	public static void main(String[] args)

	{

		new Editor();

	}

}
//主类

 
import java.awt.Color;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
 
import javax.swing.JTextPane;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Element;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.rtf.RTFEditorKit;
 
public class MyTextPane extends JTextPane {
 

	protected StyleContext m_context;
	protected DefaultStyledDocument m_doc;
	private MutableAttributeSet keyAttr, normalAttr;
	private MutableAttributeSet inputAttributes = new RTFEditorKit().getInputAttributes();
 
	public MyTextPane() {
		super();
		m_context = new StyleContext();
		m_doc = new DefaultStyledDocument(m_context);
		this.setDocument(m_doc);
 
		this.addKeyListener(new KeyAdapter() {
			public void keyReleased(KeyEvent ke) {
				syntaxParse();
			}
		});
 
		keyAttr = new SimpleAttributeSet();
		StyleConstants.setForeground(keyAttr, Color.red);
 
		normalAttr = new SimpleAttributeSet();
		StyleConstants.setForeground(normalAttr, Color.black);
	}
 
	public void syntaxParse() {
		try {
			String s = null;
			Element root = m_doc.getDefaultRootElement();
 
			int cursorPos = this.getCaretPosition();
			int line = root.getElementIndex(cursorPos);
 
			Element para = root.getElement(line);
			int start = para.getStartOffset();
			int end = para.getEndOffset() - 1;
			s = m_doc.getText(start, end - start);
 
			m_doc.setCharacterAttributes(start, s.length(), normalAttr, false);
			boolean flage = false;
			boolean flage2 = false;
			boolean firstFlage = true;
			for (int j = 0; j < s.length(); j++) {
				String simpleStr = s.substring(j, j+1);
				if (!isASCII(simpleStr)) {
					m_doc.setCharacterAttributes(start+j, 1, keyAttr, false);
				}
				if (simpleStr.equals("&")) {
					flage = true; 
					continue;
				}
				if (flage) {
					if (simpleStr.equals("#")) {
						flage2 = true;
						continue;
					}
				}
				
				if (flage2) {
					if (isNumber(simpleStr)) {
						if (firstFlage) {
							m_doc.setCharacterAttributes(start+j-2, 3, keyAttr, false);
							firstFlage = false;
						}else {
							m_doc.setCharacterAttributes(start+j, 1, keyAttr, false);
						}
						continue;
					}
				}
				flage = false;
				flage2 = false;
				firstFlage = true;
			}
			
			
			
			inputAttributes.addAttributes(normalAttr);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	
	public static boolean isASCII(int c) {  
        return c>= 0 && c < 128;
    }  
 
    public static boolean isASCII(String str) {  
        if (str == null) {
        	return false;  
        }
        if (str.length() == 1) {
        	return isASCII(str.charAt(0));
		}
        return false;  
    } 
    
    public static boolean isNumber(int c) {  
        return c>= 48 && c <= 57;
    }  
 
    public static boolean isNumber(String str) {  
        if (str == null) {
        	return false;  
        }
        if (str.length() == 1) {
        	return isNumber(str.charAt(0));
		}
        return false;  
    } 
    
}

两个类,高亮ASCII以外其他字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值