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以外其他字符