Java学习笔记——文本操作(记事本实现)

        用Java写的一个记事本的小程序,实现了新建,打开,另存为,删除,复制,剪切,粘贴,查找和替换一些菜单功能,先看效果图吧~

       打开文本文件


         下面贴上完整代码,代码里面有详细注释   

import java.awt.FileDialog;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.undo.UndoManager;
/*
 * 记事本----独孤我---2011年12月5日----绿岛网络办公室
 * 转载请注明出处* 
 * 
 * */

public class Notepad extends JFrame implements ActionListener
{
       /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	JPanel pl=new JPanel();
	JTextArea myarea=new JTextArea();
	
	//相关变量
    int start=0;//查找开始位置
    int end=0;//查找结束位置
	private String filename; //打开的文件名
	String textContent="";//编辑框中的内容
	private Writer file_writer;
	UndoManager undoManager = new UndoManager();//撤销管理器
	
     public Notepad()
     {
    	initComponment();//面板初始化
     }
     private void initComponment()
     {   
    	 //菜单栏
    	 JMenuBar mb=new JMenuBar();
    	 
    	 //弹出菜单
    	 final JPopupMenu myPopMenu=new JPopupMenu();
    	 JMenuItem copy_pop=new JMenuItem("复制");
    	 JMenuItem cut_pop=new JMenuItem("剪切");
    	 JMenuItem paste_pop=new JMenuItem("粘贴");
    	 JMenuItem delete_pop=new JMenuItem("删除");    	 
    	 JMenuItem exit_pop=new JMenuItem("退出");
    	 
    	 myPopMenu.add(cut_pop);
    	 myPopMenu.add(copy_pop);
    	 myPopMenu.add(delete_pop);
    	 myPopMenu.add(paste_pop);    	 
    	 myPopMenu.add(exit_pop);
    	 
    	 cut_pop.addActionListener(this);
    	 copy_pop.addActionListener(this);
    	 delete_pop.addActionListener(this);
    	 paste_pop.addActionListener(this);
    	 exit_pop.addActionListener(this);
    	 
    	 
    	 //菜单
    	 JMenu file=new JMenu("文件");
    	 JMenu edit=new JMenu("编辑");
    	 JMenu help=new JMenu("帮助");
    	 
    	 
    	 //子菜单
    	 JMenuItem new_file=new JMenuItem("新建");
    	 JMenuItem open=new JMenuItem("打开");    	 
    	 JMenuItem save=new JMenuItem("保存");
    	 JMenuItem save_as=new JMenuItem("另存为");
    	 JMenuItem exit=new JMenuItem("退出");
    	 
    	 JMenuItem search=new JMenuItem("查找和替换");
    	 
    	 JMenuItem copy=new JMenuItem("复制");
    	 JMenuItem cut=new JMenuItem("剪切");
    	 JMenuItem paste=new JMenuItem("粘贴");
    	 JMenuItem delete=new JMenuItem("删除");
    	 
    	 
    	 //绑定监听事件
    	 new_file.addActionListener(this);
    	 open.addActionListener(this);
    	 save.addActionListener(this);
    	 save_as.addActionListener(this);
    	 exit.addActionListener(this);
    	 
    	
    	 copy.addActionListener(this);
    	 cut.addActionListener(this);
    	 paste.addActionListener(this);
    	 delete.addActionListener(this);
    	 search.addActionListener(this);    	 
    	 
    	 
    	 //将菜单和相应的子菜单添加到菜单栏
    	 file.add(open);
    	 file.add(new_file);
    	 file.add(save);
    	 file.add(save_as);
    	 file.addSeparator();
    	 file.add(exit);
    	 
    	 edit.add(copy);
    	 edit.add(cut);
    	 edit.add(paste);
    	 edit.add(delete);
    	 edit.add(search);
    	 
    	 
    	 
    	 mb.add(file);
    	 mb.add(edit);
    	 mb.add(help);
    	 
    	 
    	 
    	 //给文本区域添加滚动条
    	 myarea.add(myPopMenu);
    	 JScrollPane scrollpane=new JScrollPane(myarea);
    	 //主窗口
    	 setTitle("记事本");
    	 setSize(600,400);
    	 setLocation(400,300);
    	 
    	 setJMenuBar(mb);
    	 //add("Center",myarea);
    	 add(scrollpane);
    	// add(myPopMenu);
    	 
    	 //窗口监听
      	 addWindowListener(new WindowAdapter() {
    		 public void windowClosing(WindowEvent evt)
    		 {
    			 if(!myarea.getText().equals(textContent))
    				{
    					int result=JOptionPane.showConfirmDialog(null,"文件内容已改变,确认保存退出吗?","警告",1);
    					if(result==JOptionPane.OK_OPTION)
    					{   
    						save();
    						System.exit(0);
    					}
    				}
    				else
    				System.exit(0);
    		 }	
		}); 
      	 //鼠标监听
      	 myarea.addMouseListener(new MouseAdapter() {
		     public void mousePressed(MouseEvent e)
		     {
		    	 int mods=e.getModifiers();
		    	//鼠标右键
		    	if((mods&InputEvent.BUTTON3_MASK)!=0){
		    	//弹出菜单
		    	myPopMenu.show(e.getComponent(),e.getX(),e.getY());
		    	}
		    }
		     
      	 });
    
     }
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
	try
	{
	    if(e.getActionCommand()=="新建")
	    {
	    	myarea.setText("");
	    }
		else if(e.getActionCommand()=="打开")
		{
			FileDialog fileDialog=new FileDialog(this,"打开文件",FileDialog.LOAD);
			fileDialog.setFile("*.txt");
			fileDialog.setVisible(true);
			if(fileDialog.getFile()!=null)
			{
				filename=fileDialog.getDirectory()+fileDialog.getFile();//获得文件名
				
				//读取文件
				
				  FileReader file_reader=new FileReader(filename);//此处必须要捕获异常
				  BufferedReader br=new BufferedReader(file_reader);
				  String temp="";
				  while(br.ready())//判断缓冲区是否为空,非空时返回true
				  {
					   int c=br.read();
					   temp+=(char)c;
				  }
				  myarea.setText(temp);
				  br.close();
				  file_reader.close();
				  textContent=myarea.getText();
				  setTitle("记事本-"+filename);			
				
			}
		}
		else if(e.getActionCommand()=="保存")
		{
			save();
		}
		else if(e.getActionCommand()=="另存为")
		{
			FileDialog fileDialog=new FileDialog(this,"另存为",FileDialog.SAVE);
			fileDialog.setFile("*.txt");
			fileDialog.setVisible(true);
			if(fileDialog.getFile()!=null)	           {
				  
				   //File temp=new File(file.getAbsolutePath()+".txt");
				   //file.renameTo(temp);
				   //写入文件
				   FileWriter fw=new FileWriter(fileDialog.getDirectory()+fileDialog.getFile());
				   BufferedWriter bw=new BufferedWriter(fw);
				   PrintWriter pw=new PrintWriter(bw);				   
				   pw.print(myarea.getText());
				   textContent=myarea.getText();
				   pw.close();
				   bw.close();
				   fw.close();
				   
				}
		}
		else if(e.getActionCommand()=="退出")
		{   
			if(!myarea.getText().equals(textContent))
			{
				int result=JOptionPane.showConfirmDialog(null,"文件内容已改变,确认保存退出吗?","警告",1);
				if(result==JOptionPane.OK_OPTION)
				{
			        save();
					System.exit(0);
				}
			}
			else
			System.exit(0);
		}
		else if(e.getActionCommand()=="查找和替换")
		{    
			//查找对话框
			JDialog search=new JDialog(this,"查找和替换");
			search.setSize(200, 100);
			search.setLocation(450,350);
			JLabel label_1=new JLabel("查找的内容");
			JLabel label_2=new JLabel("替换的内容");
			final JTextField textField_1=new JTextField(5);
			final JTextField textField_2=new JTextField(5);
			JButton buttonFind=new JButton("查找下一个");
			JButton buttonChange=new JButton("替换");
			JPanel panel=new JPanel(new GridLayout(2,3));
			panel.add(label_1);
			panel.add(textField_1);
			panel.add(buttonFind);
			panel.add(label_2);
			panel.add(textField_2);
		    panel.add(buttonChange);
			search.add(panel);
			 search.setVisible(true);
			
			
			//为查找下一个 按钮绑定监听事件
			buttonFind.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					// TODO Auto-generated method stub
				   String findText=textField_1.getText();//查找的字符串
				   
				   String textArea=myarea.getText();//当前文本框的内容
				   start=textArea.indexOf(findText,end);
				   end=start+findText.length();
				   if(start==-1)//没有找到
				   {
					   JOptionPane.showMessageDialog(null,"没找到"+findText,"记事本",JOptionPane.WARNING_MESSAGE);
					   myarea.select(start, end);
				   }
				   else
				   {
					   myarea.select(start,end);
				   }
				   
				}
			});
			//为替换按钮绑定监听时间
		    buttonChange.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					// TODO Auto-generated method stub
					String changeText=textField_2.getText();//替换的字符串
					myarea.select(start, end);
					myarea.replaceSelection(changeText);
					myarea.select(start, end);					
				}
			});  
			  
		    
			
			
		}
		else if(e.getActionCommand()=="复制")
		{
			copy();		
		}
		else if(e.getActionCommand()=="粘贴")
		{    
			paste();
		}
		else if(e.getActionCommand()=="剪切")
		{
			cut();
		}
		else if(e.getActionCommand()=="删除")
		{
			delete();
		}		
	}
	catch(Exception ex)
	{
		    ex.printStackTrace();
	}
		
		
		
		
		
	}
	public static void main(String[] args)
	{
		new Notepad().setVisible(true);
	}
	private void save()
	{
		try
	    {
		File file=new File(filename);
		FileWriter file_writer;
		
		file_writer = new FileWriter(file);
		
		BufferedWriter bw=new BufferedWriter(file_writer);
		PrintWriter pw=new PrintWriter(bw);//如果直接向文件中输入而不是输入缓冲区,效率低下
		
		pw.print(myarea.getText());
		textContent=myarea.getText();
		pw.close();
		bw.close();
		file_writer.close();
	    }
	    catch(Exception e)
	    {
	    	e.printStackTrace();
	    }
	}
	private void cut()
	{
		copy();
		delete();
	}
	private void copy()
	{
		if(myarea.getSelectedText()==null)
		{
			JOptionPane.showMessageDialog(null, "你没有选中任何文字!","记事本",JOptionPane.WARNING_MESSAGE);
		}
		Clipboard clipBoard= Toolkit.getDefaultToolkit().getSystemClipboard();
		StringSelection stringSelection=new StringSelection(myarea.getSelectedText());
		clipBoard.setContents(stringSelection, null);
	}
	private void paste() throws UnsupportedFlavorException, IOException
	{
		String content_copy="";
		//构造系统剪切板
		Clipboard clipBoard= Toolkit.getDefaultToolkit().getSystemClipboard();
		
		//获取剪切板内容
		Transferable content=clipBoard.getContents(null);
		
		if(content!=null)
		{
			//检查是否是文本类型
			if(content.isDataFlavorSupported(DataFlavor.stringFlavor))
			{
				content_copy=(String) content.getTransferData(DataFlavor.stringFlavor);
				
				//判断文本框中有无文字选中
				if(myarea.getSelectedText()!=null)
				{
					myarea.replaceSelection(content_copy);
				}
				else
				{
					myarea.insert(content_copy, myarea.getSelectionStart());
				}
			}
		}
		else
			JOptionPane.showMessageDialog(null, "系统剪贴板中无内容!","记事本",JOptionPane.WARNING_MESSAGE);
	
		
	}
	private void delete()
	{
		myarea.replaceSelection("");
	}
	
	
	
      
}

    


  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值