Java实现记事本

来源:互联网 发布:什么牌子沙发好 知乎 编辑:程序博客网 时间:2024/06/03 10:43

  本文程序来自《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("文件");//创建,并初始化菜单栏menuBarMenu editMenu=new Menu("编辑");//创建,并初始化文本区textAreaMenuItem 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对象fileFileReader readln = new FileReader(file);//由file对象创建FileReader对象int size = (int)file.length();//返回文件长度int charsRead = 0;//创建,初始化整型数据charsReadchar[] 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方法,在构造器中调用即可。