Java实现记事本

  本文程序来自《Java从入门到精通》

package futuremaster.com;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.io.*;
public class Notebook extends Frame{
	MenuBar menuBar=new MenuBar();
	TextArea textArea=new TextArea();
	//文件菜单
	Menu fileMenu=new Menu("文件");//创建,并初始化菜单栏menuBar
	Menu editMenu=new Menu("编辑");//创建,并初始化文本区textArea
	MenuItem newItem =new MenuItem("新建");
	MenuItem openItem =new MenuItem("打开");
	MenuItem saveItem=new MenuItem("保存");
	MenuItem saveAsItem=new MenuItem("另存");
	MenuItem exitItem=new MenuItem("退出");
	MenuItem selectItem=new MenuItem("全选");
	MenuItem copyItem=new MenuItem("复制");
	MenuItem cutItem=new MenuItem("剪贴");
	MenuItem pasteItem=new MenuItem("粘贴");
    String fileName="NoName.txt";//设置默认的文件名
    Toolkit toolKit=Toolkit.getDefaultToolkit();//获取默认工具包
    Clipboard clipBoard=toolKit.getSystemClipboard();//获取剪切板对象
	private FileDialog openFileDialog=new FileDialog(this,"Open File",FileDialog.LOAD);
    private FileDialog saveAsFileDialog=new FileDialog(this,"Save File As",FileDialog.SAVE);
    public Notebook(){
    	setTitle("Notepad");
    	setFont(new Font("Times New Roman",Font.PLAIN,12));//设置字体
    	setBackground(Color.white);//设置背景色
    	setSize(600,400);//设置窗口大小
    	fileMenu.add(newItem);//在菜单中添加“新建”菜单项
    	fileMenu.add(openItem);
    	fileMenu.addSeparator();//在菜单中添加分割线
    	fileMenu.add(saveItem);
    	fileMenu.add(saveAsItem);
    	fileMenu.addSeparator();
    	fileMenu.add(exitItem);
    	editMenu.add(selectItem);
    	editMenu.addSeparator();
    	editMenu.add(cutItem);
    	editMenu.add(cutItem);
    	editMenu.add(pasteItem);
    	menuBar.add(fileMenu);
    	menuBar.add(editMenu);
    	setMenuBar(menuBar);//为窗口添加菜单栏
    	add(textArea);//为窗口添加textArea
    	addWindowListener(new WindowAdapter(){
    		public void windowClosing(WindowEvent e){
    			System.exit(0);
    		}
    	});
    	newItem.addActionListener(new EventHandler());//   事件绑定
    	openItem.addActionListener(new EventHandler());
    	saveItem.addActionListener(new EventHandler());
    	saveAsItem.addActionListener(new EventHandler());
    	exitItem.addActionListener(new EventHandler());
    	selectItem.addActionListener(new EventHandler());
    	copyItem.addActionListener(new EventHandler());
    	cutItem.addActionListener( new EventHandler());
    	pasteItem.addActionListener(new EventHandler());
    	
    }

  //事件处理
    class EventHandler implements ActionListener{
    public void actionPerformed(ActionEvent e){
    	Object eventSource=e.getSource();
    	if(eventSource==newItem){
    		textArea.setText("");
    	}else if(eventSource==openItem)
    	{
    		openFileDialog.setVisible(true);
    		fileName=openFileDialog.getDirectory()+openFileDialog.getFile();
    		if(fileName!=null)
    			readFile(fileName);
    	}else if(eventSource==saveItem)
    	{
    		openFileDialog.setVisible(true);
    		fileName=openFileDialog.getDirectory()+openFileDialog.getFile();
    		if(fileName!=null)
    			writeFile(fileName);
    	}else if(eventSource==saveAsItem)
    	{
    		saveAsFileDialog.setVisible(true);
    		fileName=saveAsFileDialog.getDirectory()+saveAsFileDialog.getFile();
    		if(fileName!=null)
    			writeFile(fileName);
    	}else if(eventSource==selectItem)
    	{
    		textArea.selectAll();
    	}else if(eventSource==copyItem)
    	{
    		String text=textArea.getSelectedText();
    		StringSelection selection=new StringSelection(text);
    		clipBoard.setContents(selection,null);
    			}else if(eventSource==cutItem) 
    			{
    				String text=textArea.getSelectedText();
    				StringSelection selection =new StringSelection(text);
    				clipBoard.setContents(selection,null);
    				textArea.replaceRange("",textArea.getSelectionStart(),textArea.getSelectionEnd());
    			}else if(eventSource==pasteItem)
    			{
    				Transferable contents=clipBoard.getContents(this);
    				if(contents==null)return;
    				String text;
    				text="";
    				try
    				{
    					text=(String)contents.getTransferData(DataFlavor.stringFlavor);
    				}catch(Exception exception){}
    				textArea.replaceRange(text,textArea.getSelectionStart(),textArea.getSelectionEnd());//用于指定替换
    			}else if(eventSource==exitItem){
    				System.exit(0);
    			}
    }
// 写文件
	private void writeFile(String fileName) {
		try{
			File file = new File(fileName);
			FileWriter writeOut = new FileWriter(file);
			writeOut.write(textArea.getText());//将文本区内容写入文件
			writeOut.close();
		}catch(IOException e){//捕获异常
			System.out.println("Error writing file");
		}
	}
//读文件
	private void readFile(String fileName) {
		try{
			File file = new File(fileName);//创建,初始化File对象file
			FileReader readln = new FileReader(file);//由file对象创建FileReader对象
			int size = (int)file.length();//返回文件长度
			int charsRead = 0;//创建,初始化整型数据charsRead
			char[] content = new char[size];//创建字符类型数组
			while(readln.ready())//循环读流数据
				charsRead += readln.read(content,charsRead,size-charsRead);//读出文件字符
			readln.close();//关闭readln对象
			textArea.setText(new String(content,0,charsRead));//设置文本区内容
		}catch(IOException e){
			System.out.println("Error opening File");//输出字符串信息
		}
		
	}
    }
}


	

1.菜单栏的“文件”“编辑”选项是怎么实现的?
2.菜单项的“新建”、“打开”、“保存”、“另存”、“退出”、“全选”、“复制”、“剪贴”、“粘贴”功能的实现细节是怎么样的?
3.“退出”直接用System.exit(0)可以吗?
4.怎么这个程序可以生成一个这样的有编辑窗口的图形界面,是继承了什么类吗?
5.这是applet还是application?
6.是否要自行实现换行,如果是那怎么实现?
7.Toolkit是什么?
8.Clipboard又是什么?
9.背景色为什么是白色的?

答:
1.先用Menu fileMenu=new Menu(“文件”)语句生成一个文件对象,然后在构造器里用Menu.add(MenuItem)添加到文件菜单的下拉列表里。编辑栏同理。
2.这些都是菜单项目,前面已经用MenuItem类生成相应对象→然后调用此对象的addActionListener(ActionListener)方法→因为ActionListener只是一个接口,要定义一个类来实现这个接口(class EventHandler implements ActionListener)→重写ActionListener.actionPerformed(ActionEvent)→调用ActionEvent.getSource()获取事件源→
(1)新建文件:TextArea.setText(""),设置文本内容为“”;
(2)打开文件:
查看手册:
FileDialog(Dialog parent, String title, int mode)
          创建一个具有指定标题的文件对话框窗口,用于加载或保存文件。
所以private FileDialog openFileDialog=new FileDialog(this,"Open File",FileDialog.LOAD),定义一个用于打开文件的对话框,在需要的时候使用FileDialog.setVisible(true),再用FileDialog.getDirectory和FileDialog.getFile()获取文件名和路径,因为之后readFile(filename)加载文件内容。
  readFile(filename)是自己定义的函数,这函数主要通过FileReader.read()和TextArea.setText()完成。
手册中的FileReader.read()如下:
read
public abstract int read(char[] cbuf,
                         int off,
                         int len)
                  throws IOException将字符读入数组的某一部分。在某个输入可用、发生 I/O 错误或者到达流的末尾前,此方法一直阻塞。

参数:
cbuf - 目标缓冲区
off - 开始存储字符处的偏移量
len - 要读取的最多字符数
返回:
读取的字符数,如果已到达流的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误

将读出来的cbuf写到文本窗的方法为TextArea.setText(cbuf)。

(3)保存文件:和打开文件一样,也要一个对话框,然后,自己写一个writeFile(filename)函数,用FileWriter.write(String)和TextArea.getText()实现。
(4)另存为:与保存文件一样
(5)全选:调用textArea.selectAll()
(6)复制:调用TextArea.getSelectedText()选中文字段,把选中的内容封装到StringSelection对象中,然后调用public void setContents(Transferable contents,ClipboardOwner owner)把内容传给ClipBoard。
(7)剪切:与复制一样,不过要外加一步用(TextArea类方法)public void replaceRange(String str,int start,int end)把选中文本置空。
(8)粘贴:与剪切相反,先把ClipBoard中的内容用clipBoard.getContents()提取出来装进Transferable(数据传输操作接口)实例中。再用Object getTransferData(DataFlavor flavor)返回将要被传输的数据存入String对象中。最后用replaceRange()向TextArea填入字符串。
(9)退出直接用exit(0)。

3.目前只知道在exit的时候用一个线程来做一些释放工作,但是具体是什么还是不懂,留着以后更新吧
4.继承了Frame类,一个具有标题和边框的类,然后在类中new一个TextArea类。
5.主要是用Frame建立的图形界面,所以是一个Applet。
6.这里没有实现换行功能,请恕晚辈愚钝,不懂怎么做,以后再更新。
7.手册中说:大多数应用程序不应直接调用该类中的任何方法。Toolkit 定义的方法是一种“胶水”,将 java.awt 包中与平台无关的类与 java.awt.peer 中的对应物连接起来。Toolkit 定义的一些方法能直接查询本机操作系统。
本程序主要用来获取ClipBoard(剪切板)。
8.ClipBoard是系统的剪贴板,提供剪贴的功能接口
9.Frame类有setBackground方法,在构造器中调用即可。
K讯  (kxun.top)

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值