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

📄 edit.java

📁 设计一个Java程序编辑器 实验目的:图形界面、线程、流与文件等技术的综合应用。 题意 设计一个图形界面的文档编辑器
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -