📄 edit.java
字号:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.text.*;
import javax.swing.undo.*;
import javax.swing.event.*;
import javax.swing.event.AncestorListener;
import javax.swing.*;
public class Edit extends JPanel implements ActionListener,DocumentListener,ItemListener,KeyListener
{
static JTextPane editor;//文本编辑区
JMenuItem
mFileNew, mFileOpen,mFileSave, mFileSaveAs,mFileExit,//File 子菜单
mEditUndo, mEditRedo,mEditCut, mEditCopy, mEditPaste,mEditFind,
mEditReplace, mEditSelectAll;//Edit 子菜单
JCheckBoxMenuItem mAutoUp,mJavaView; //Tool 子菜单
JMenuItem mHelpAbout; //About 子菜单
public static JFrame frame = new JFrame();
public static JMenuBar menuedit = new JMenuBar();
UndoManager undo = new UndoManager();
UndoableEditListener undoHandler = new UndoHandler();
JPopupMenu popmenu;
static String fns; //文件名称
static boolean flag=false;//true文件修改过。false文件未被修改过。
boolean findingLoop = true;//返回查找
static boolean autoup=true,javaview=true;//是否自动更新
static int foundCount = 0;//查找到的个数
int FindStartPos = 0;//查找到的位置
public static SimpleAttributeSet set =new SimpleAttributeSet();
StyleContext sc;
static DefaultStyledDocument doc;
static String javaword[]={"abstract","boolean","break","byte","case","catch","char",
"class","continue","default","do","double","else","extends","false","final",
"finally","float","for","if","implements","import","instanceof","int","interface",
"long","native","new","null","package","private","protected","public","return",
"short","static","super","switch","synchronized","this","throw","throws","transient",
"true","try","void","while"};
static String bg,ed,javakey="(); \n\r\t=:!";
static boolean javaviewflag=true;
Edit()
{
super(true);
}
public void display() //界面显示方法
{
frame.setTitle("[未定标题]-Java 编辑器");
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if(flag) //文件是否修改。如修改过提示保存
{
int option = JOptionPane.showConfirmDialog(null,
"文件已经改变!\n保存文件吗?", "FJava 编辑器!", JOptionPane.YES_NO_OPTION);
switch(option)
{
case JOptionPane.NO_OPTION ://不保存
break;
case JOptionPane.YES_OPTION ://保存
if(fns == null) //文件名是否空
{
saveFile(true); //为空则输入文件名保存
}
else
{
saveFile(false); //文件名不空。直接保存
}
break;
}
}
System.exit(0);//未修改过。直接退出。
}
});
JMenu menuFile = new JMenu("文件", true);
JMenu menuEdit = new JMenu("编辑", true);
JMenu menuTool = new JMenu("工具", true);
JMenu menuHelp = new JMenu("关于", true);
/*************** File **************/
mFileNew = new JMenuItem("新建(N)",'N');
mFileNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
mFileOpen= new JMenuItem("打开(O)...",'O');
mFileOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
mFileSave= new JMenuItem("保存(S)",'S');
mFileSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
mFileSaveAs= new JMenuItem("另存为(A)...",'A');
mFileExit= new JMenuItem("退出(X)",'X');
menuFile.add(mFileNew);
menuFile.add(mFileOpen);
menuFile.addSeparator();
menuFile.add(mFileSave);
menuFile.add(mFileSaveAs);
menuFile.addSeparator();
menuFile.add(mFileExit);
menuedit.add(menuFile);
/*************** Edit **************/
mEditUndo=new JMenuItem("撤消(U)",'U');
mEditUndo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));
mEditRedo=new JMenuItem("恢复(O)",'O');
mEditRedo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK));
mEditCut=new JMenuItem("剪切(T)",'T');
mEditCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
mEditCopy=new JMenuItem("复制(C)",'C');
mEditCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
mEditPaste=new JMenuItem("粘贴(P)",'P');
mEditPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
mEditFind=new JMenuItem("查找(F)",'F');
mEditFind.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK));
mEditReplace=new JMenuItem("替换(R)",'R');
mEditReplace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_MASK));
mEditSelectAll=new JMenuItem("全选(A)",'A');
mEditSelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
menuEdit.add(mEditUndo);
mEditUndo.setEnabled(false);
menuEdit.add(mEditRedo);
mEditRedo.setEnabled(false);
menuEdit.addSeparator();
menuEdit.add(mEditCut);
menuEdit.add(mEditCopy);
menuEdit.add(mEditPaste);
menuEdit.addSeparator();
menuEdit.add(mEditFind);
menuEdit.add(mEditReplace);
menuEdit.addSeparator();
menuEdit.add(mEditSelectAll);
menuedit.add(menuEdit);
/*************** Tool **************/
mAutoUp=new JCheckBoxMenuItem("自动更新",true);
mJavaView=new JCheckBoxMenuItem("关键字显示",true);
menuTool.add(mAutoUp);
menuTool.add(mJavaView);
menuedit.add(menuTool);
/*************** Help**************/
mHelpAbout =new JMenuItem("关 于(A)",'A');
menuHelp.add(mHelpAbout);
menuedit.add(menuHelp);
mFileNew.addActionListener(this);
mFileOpen.addActionListener(this);
mFileSave.addActionListener(this);
mFileSaveAs.addActionListener(this);
mFileExit.addActionListener(this);
mEditUndo.addActionListener(this);
mEditRedo.addActionListener(this);
mEditCut.addActionListener(this);
mEditCopy.addActionListener(this);
mEditPaste.addActionListener(this);
mEditFind.addActionListener(this);
mEditReplace.addActionListener(this);
mEditSelectAll.addActionListener(this);
mAutoUp.addActionListener(this);
mJavaView.addActionListener(this);
mHelpAbout.addActionListener(this);
Container content = frame.getContentPane();
sc = new StyleContext();
doc = new DefaultStyledDocument(sc);
editor = new JTextPane(doc);
editor.addKeyListener(this);
editor.setFont(new Font("Serif", Font.PLAIN, 14));
editor.setSelectedTextColor(Color.WHITE);
editor.setSelectionColor(Color.DARK_GRAY);
editor.getDocument().addDocumentListener(this);
editor.getDocument().addUndoableEditListener(undoHandler);
JScrollPane scroller = new JScrollPane(editor);
content.add(scroller, BorderLayout.CENTER);
createPopupMenu();
frame.pack();
frame.setJMenuBar(menuedit);
frame.setSize(680, 400);
frame.setLocation(100,70);
frame.show();
}
public static void main(String[] args)
{
(new Edit()).display();
new Autoup().start();
}
public void createPopupMenu()
{
JMenuItem menuItem;
//Create the popup menu.
JPopupMenu popup = new JPopupMenu();
menuItem = new JMenuItem(" 撤消(U) ",'U');
menuItem.addActionListener(this);
popup.add(menuItem);
menuItem = new JMenuItem(" 恢复(O) ",'O');
menuItem.addActionListener(this);
popup.add(menuItem);
popup.addSeparator();
menuItem = new JMenuItem(" 剪切(T) ",'T');
menuItem.addActionListener(this);
popup.add(menuItem);
menuItem = new JMenuItem(" 复制(C) ",'C');
menuItem.addActionListener(this);
popup.add(menuItem);
menuItem = new JMenuItem(" 粘贴(P) ",'P');
menuItem.addActionListener(this);
popup.add(menuItem);
popup.addSeparator();
menuItem = new JMenuItem(" 全选(A) ",'A');
menuItem.addActionListener(this);
popup.add(menuItem);
//Add listener to the text area so the popup menu can come up.
MouseListener popupListener = new PopupListener(popup);
editor.addMouseListener(popupListener);
}
public void itemStateChanged(ItemEvent e) {}
public static void javaview(int leng1,int leng2)
{
String str1,str2;
int a,b;
if(leng1<0)leng1=0;
if(leng2>doc.getLength())leng2=doc.getLength();
Edit.editor.select(leng1, leng2);
Edit.resetcolors();
for (int i=0;i<javaword.length;i++)
{
str2=javaword[i];
b=str2.length();
for(a=leng1;a+b<leng2+1;a++)
{
try
{
str1=editor.getText(a, b);
if(str1.equals(str2))
{
if(a>leng1)bg=editor.getText(a-1, 1);
else bg=" ";
if (a+b<leng2)ed=Edit.editor.getText(a+b, 1);
else ed=" ";
if(javakey.indexOf(bg)>-1 && javakey.indexOf(ed)>-1)
{
Edit.editor.select(a, a+b);
Edit.setcolors();//将关键字显示蓝色
}
}
}
catch(Exception Ie){}
}
}
Edit.editor.select(0, 0);
Edit.editor.replaceSelection("");
Edit.resetcolors();
}
public static void setcolors()//设置当前颜色为蓝色
{
StyleConstants.setForeground(set, Color.BLUE);
editor.setCharacterAttributes(set,true);
}
public static void resetcolors()//设置当前颜色为黑色
{
StyleConstants.setForeground(set, Color.BLACK);
editor.setCharacterAttributes(set,true);
}
//ActionListener
public void actionPerformed(ActionEvent e) //按钮事件
{
JMenuItem source = (JMenuItem)(e.getSource());
if(e.getSource()==mFileNew)
{
if(flag)
{
changfile();
}
else
{
setNewFile();
}
}
else if(e.getSource()==mFileOpen)
{
openFile();
}
else if(e.getSource()==mFileSave)
{
saveFile(false);
}
else if(e.getSource()==mFileSaveAs)
{
saveFile(true);
}
else if(e.getSource()==mFileExit)
{
if(flag)
{
changfile();
}
System.exit(0);
}
else if(e.getSource()==mEditUndo || source.getText()==" 撤消(U) ")
{
if(undo.canUndo())
{
try
{
undo.undo();
mEditRedo.setEnabled(true);
} catch(CannotUndoException cue)
{
System.out.println("不能够撤消: " + cue);
cue.printStackTrace();
}
if(!undo.canUndo())
mEditUndo.setEnabled(false);
}
}
else if(e.getSource()==mEditRedo || source.getText()==" 恢复(O) ")
{
if(undo.canRedo())
{
try
{
undo.redo();
} catch(CannotUndoException cue)
{
System.out.println("不能够恢复撤消 " + cue);
cue.printStackTrace();
}
if(!undo.canRedo())
mEditRedo.setEnabled(false);
}
}
else if(e.getSource()==mEditCut || source.getText()==" 剪切(T) ")
{
editor.cut();
}
else if(e.getSource()==mEditCopy || source.getText()==" 复制(C) ")
{
editor.copy();
}
else if(e.getSource()==mEditPaste || source.getText()==" 粘贴(P) ")
{
editor.paste();
}
else if(e.getSource()==mEditFind)
{
findowrd();
}
else if(e.getSource()==mEditReplace)
{
replaceword();
}
else if(e.getSource()==mEditSelectAll || source.getText()==" 全选(A) ")
{
editor.selectAll();
}
else if(e.getSource()==mAutoUp)
{
if (mAutoUp.getState() )
autoup=true;
else
autoup=false;
}
else if(e.getSource()==mJavaView)
{
if (!mJavaView.getState())
{
int where=editor.getCaretPosition();
editor.selectAll();
resetcolors();
editor.setCaretPosition(where);
javaview=false;
}
else
{
javaview(0,doc.getLength());
javaview=true;
}
}
else if(e.getSource()==mHelpAbout)
{
JOptionPane.showMessageDialog(null,"Java 编辑器\nVersion 1.0\n 01级计算机教育班", "关于Java编辑器", JOptionPane.INFORMATION_MESSAGE);
}
}//end of ActionListener
void changfile() //是否保存文件
{
int option = JOptionPane.showConfirmDialog(null, "保存修改吗 ?", "Java 编辑器!",JOptionPane.YES_NO_OPTION);
if(fns == null)
{
switch(option)
{
case JOptionPane.NO_OPTION :
setNewFile();
break;
case JOptionPane.YES_OPTION :
saveFile(true);
setNewFile();
break;
}
}
else
{
switch(option)
{
case JOptionPane.NO_OPTION :
setNewFile();
break;
case JOptionPane.YES_OPTION :
saveFile(false);
setNewFile();
break;
}
}
}
class UndoHandler implements UndoableEditListener
{
public void undoableEditHappened(UndoableEditEvent uee)
{
undo.addEdit(uee.getEdit());
}
}
void setNewFile()
{
editor.setText("");
undo.discardAllEdits();
mEditUndo.setEnabled(false);
frame.setTitle("[未定标题]-Java 编辑器");
}
void openFile()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -