用JAVA编写一个迷你编辑器.docx

上传人:b****5 文档编号:4040851 上传时间:2022-11-27 格式:DOCX 页数:18 大小:21.33KB
下载 相关 举报
用JAVA编写一个迷你编辑器.docx_第1页
第1页 / 共18页
用JAVA编写一个迷你编辑器.docx_第2页
第2页 / 共18页
用JAVA编写一个迷你编辑器.docx_第3页
第3页 / 共18页
用JAVA编写一个迷你编辑器.docx_第4页
第4页 / 共18页
用JAVA编写一个迷你编辑器.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

用JAVA编写一个迷你编辑器.docx

《用JAVA编写一个迷你编辑器.docx》由会员分享,可在线阅读,更多相关《用JAVA编写一个迷你编辑器.docx(18页珍藏版)》请在冰豆网上搜索。

用JAVA编写一个迷你编辑器.docx

用JAVA编写一个迷你编辑器

用JAVA编写一个迷你编辑器

WINDOWS的记事本程序是非常方便的一个文字处理工具,用它来编辑纯文本文件快捷而灵巧。

我用JAVA写了一个编辑器程序,模仿“记事本”的功能。

这不是为了替代记事本,而是因为下列两个目的:

1编辑器中拥有的功能是一切与文字相关的软件的基本功能,其许多功能的实现方法可以为其它程序所借鉴。

甚至可以发展成一个独立的实用程序。

2因为编程中用到多方面的知识,所以可作为初学者综合所学知识的一次实践机会。

本程序命名为Notepad.java,用命令行:

javaNotepad运行后呈现如下的界面图:

一本程序的功能

本程序只有一个菜单条和一个带滚动条的编辑区域。

菜单条有如下功能”

1.文件菜单,包含新建、打开、保存和另存为,退出等菜单项,用法与WINDOWS的记事本相仿,如弹出文件的打开对话框、保存对话框等。

2.编辑菜单,用以完成文字的复制、粘贴和删除任务。

3.格式菜单,设置文本自动换行、设置字体和输入当前日期。

4.显示帮助的内容和Abort信息。

二用户界面的设计

编程分两步走。

第一步先设计好如上的用户界面,编译通过后程序有了一个空壳。

第二步在逐个给菜单项写功能代码,就是给每个菜单项编写一个监听器类,并添加到相应的菜单项上。

㈠菜单和文本框的设计

菜单和菜单项的声明在类开始处定义,创建菜单和文本区则在类的构造器中完成。

菜单的声明如下:

publicclassNotepadextendsJFrame{

privateJTextAreatext=newJTextArea(30,48);

privateClipboardclipbd=

 getToolkit().getSystemClipboard();

privateStringfileName="未命名";

privatebooleanisNamed=false;

privateStringcontent="";

privateJMenuBarmb=newJMenuBar();

privateJMenu

 file=newJMenu("文件"),

 edit=newJMenu("编辑"),

 style=newJMenu("格式"),

 help=newJMenu("帮助");

privateJMenuItemfileItem[]={

 newJMenuItem("新建"),

 newJMenuItem("打开"),

 newJMenuItem("保存"),

 newJMenuItem("另存为"),

 newJMenuItem("退出"),

};

privateJMenuItemeditItem[]={

 newJMenuItem("复制"),

 newJMenuItem("粘贴"),

 newJMenuItem("删除"),

 newJMenuItem("全选"),

};

privateJMenuItemstyleItem[]={

 newJMenuItem("自动换行"),

 newJMenuItem("字体"),

 newJMenuItem("日期"),

 newJMenuItem("Java"),

};

privateJMenuItemhelpItem[]={

 newJMenuItem("帮助"),

 newJMenuItem("关于"),

};

声明了文本区text作为编辑区域,声明了剪贴板对象Clipboardclipbd用于编辑操作。

fileName保存“打开或保存”的文件名,content 用来保存从文件读写的内容,booleanisNamed用来记录编辑区中的内容是否和一个文件相关联。

如果文件已经有了名字,“保存”菜单就直接写入该文件,否则要先打开“保存对话框”。

新建文件时isNamed为假,窗口标题显示“未命名”。

接着就生命了菜单条mb和四个菜单file,edit,style,help以及他们的菜单项。

用fileItem[]来定义菜单项,便于以后要扩充菜单,这要增加一行newJMenuItem("XXX"),和添加一个监听类XXXl就可以了。

㈡在构造器中构建视窗

在构造器中创建菜单,假如文本区,各菜单项添加监听器。

publicNotepad(){

 setJMenuBar(mb);//窗口设置菜单条

 Containercp=getContentPane();

 cp.add(newJScrollPane(text));//添加有滚动条的文本区

 text.setText("");

 mb.add(file);//加入文件菜单

 for(inti=0;i

  file.add(fileItem[i]);

 mb.add(edit);//加入编辑菜单

 for(inti=0;i

  edit.add(editItem[i]);

 mb.add(style); for(inti=0;i

  style.add(styleItem[i]);

 mb.add(help);

 for(inti=0;i

 help.add(helpItem[i]);

 text.setFont(newFont("system",0,14));

 StringSelectionclipString=newStringSelection("");

 clipbd.setContents(clipString,clipString);

//为菜单项添加监听器。

 fileItem[0].addActionListener(newNewL());

 fileItem[1].addActionListener(newOpenL());

 fileItem[2].addActionListener(newSaveL());

 fileItem[3].addActionListener(newSaveAsL());

 fileItem[4].addActionListener(newExitL());

 editItem[0].addActionListener(newCopyL());

 editItem[1].addActionListener(newPasteL());

 editItem[2].addActionListener(newCutL());

 editItem[3].addActionListener(newAllselectL());

 styleItem[0].addActionListener(newWrapL());

 styleItem[1].addActionListener(newWrapL());

 styleItem[2].addActionListener(newDateL());

 

 setTitle("采摘器"+"--"+fileName);

}

用循环语句加入菜单项,以后增加菜单项时此处代码不用修改。

而加入菜单时不用 循环方法,而个别加入是为了程序易读,增加菜单的几率是比较小的。

加入main()方法后程序就可以运行了。

(先把添加监听器的这断代码注释掉!

publicstaticvoidmain(String[]args){

 Notepadnpd=newNotepad();

 npd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 npd.setSize(400,240);

 npd.setVisible(true);

}

}

三菜单功能的实现

每一个菜单功能都需要为之建立一个监听器类,并重载活动监听方法addActionListener()。

㈠ 编辑菜单——复制、删除和粘贴

1复制

“编辑/复制”功能是把从文本区中选择的内容selection送到剪贴板clipbd中。

复制监听器类CopyL的代码如下:

classCopyLimplementsActionListener{

publicvoidactionPerformed(ActionEvente){

Stringselection=text.getSelectedText();

if(selection=="")return;

StringSelectionclipString=newStringSelection(selection);

clipbd.setContents(clipString,clipString);

}

}

利用文本区的getSelectedText()方法获取你所选择的内容,存放在Notepad的字段(成员变量)selection中。

要把selection设置到剪贴板中,使用Clipboard类的setContents方法:

 clipbd.setContents(clipString,clipString);

不要StringSelection类的对象作为参数,所以声明了

StringSelectionclipString=newStringSelection(selection);。

设置剪贴板内容的方法声明如下:

publicvoidsetContents(Transferable contents,ClipboardOwner owner)

它将剪贴板的当前内容设置到指定的transferable对象contents中,并将指定的剪贴板所有者owner作为新内容的所有者注册。

如果剪贴板当前不可用,则该方法抛出IllegalStateException。

例如,在某些平台上,系统剪贴板在被别的应用程序访问时是不可用的。

2删除

“编辑/删除”功能只要利用文本区的replaceRange方法,把选择的文本替换为空字符串。

监听器类CopyL的代码如下:

classCutLimplementsActionListener{

publicvoidactionPerformed(ActionEvente){

Stringselection=text.getSelectedText();

if(selection=="")return;

StringSelectionclipString=newStringSelection(selection);

clipbd.setContents(clipString,clipString);

text.replaceRange("",text.getSelectionStart(),text.getSelectionEnd());

content=selection;

}

}

3粘贴

“编辑/粘贴”功能是把剪贴板中的数据来替换窗口中选择的内容,也要利用的replaceRange方法。

监听器类PasteL的代码如下:

classPasteLimplementsActionListener{

 publicvoidactionPerformed(ActionEvente){

 ransferableclipData=clipbd.getContents(Notepad.this);

 try{

  StringclipString=(String)clipData.getTransferData(DataFlavor.stringFlavor);

  text.replaceRange(clipString,text.getSelectionStart(),text.getSelectionEnd());

  }catch(Exceptionex){

  System.err.println("没有信息粘贴");

  } 

 }

}

先从剪贴板中获取内容getContents(),返回的数据clipData是ransferable类型的。

因为需要使用该类型的方法getTransferData()方法把数据转化成字符串。

其参数DataFlavor.stringFlavor是DataFlavor的一个静态,表示JavaUnicodeString的字符串。

函数返回一个数据对象Object,所以要用强制转换。

使用该方法是可能会抛出一个异常的。

剪贴板和数据传输类ransferable都在包ava.awt.datatransfer中。

获得了选择的内容clipString,用一个replaceRange方法就把当前选择的内容替换成前面从剪贴板中获取的内容了。

如果当前没有选择内容,那么开始和结束位置相同,就把文本粘贴当光标位置了。

作为练习,请读者自行增加一个“撤消删除”和一个“剪切”的菜单功能。

㈡读入文件和保存文件

为了实现文件菜单的功能,在主类中先建立读写文件的方法read()和write()。

privatevoidread(Stringfile)throwsIOException{

Stringline="";

Stringstr="";

try{

 BufferedReaderin=newBufferedReader(

  newFileReader(file));

 while((line=in.readLine())!

=null)

 str+=(line+"\n");

 content=str;

 in.close();

 }catch(IOExceptione){

 e.printStackTrace();

 System.exit

(1);

}

}

read(file)的功能是把文件file的内容按行读入储存在字段content中。

file是文件名也许在对话框中获得。

privatevoidwrite(Stringfile)throwsIOException{

try{

 PrintWriterout=newPrintWriter(

 newBufferedWriter(newFileWriter(file)));

 out.write(content);

 out.close();

 return;

 }catch(IOExceptione){

 e.printStackTrace();

 System.exit

(1);

}

}

write(file)的功能是把字段content写入到文件file中。

使用这两个方法是为了简化打开和保存文件的代码。

㈢文件菜单——打开、保存和另存为

1打开文件监听器

“文件/打开”菜单的主要功能是打开一个JAVA系统提供的文件对话框,它由类JFileChooser的方法showOpenDialog()来打开。

类似的,showSaveDialog()方法可打开保存文件的对话框。

classOpenLimplementsActionListener{

 publicvoidactionPerformed(ActionEvente){

 try{

  JFileChooserc=newJFileChooser();

  intrVal=c.showOpenDialog(Notepad.this);

  if(rVal==JFileChooser.APPROVE_OPTION){

   fileName=c.getSelectedFile().getPath();

   isNamed=true;

   read(fileName);

   text.setText(content);

   setTitle("采摘器"+"--"+fileName);

   return;

   }

  if(rVal==JFileChooser.CANCEL_OPTION)

   return;

   }catch(IOExceptionex){

     ex.printStackTrace();

    }

 }

}

c.showOpenDialog(Notepad.this)方法中的参数类型是Component,代码中用参数Notepad.this表示主程序本身,意思就是从主窗口Frame打开的对话框。

它返回一个整数rVal,用来判断用户在对话框中选择的结果。

当你选择了一个存在的文件后,返回值是JFileChooser.APPROVE_OPTION,如果你放弃选择,那么返回值是JFileChooser.CANCEL_OPTION。

如果你选择了一个存在的文件名,用getSelectedFile()得到一个File类型对象,因此可以获取药打开的文件名,然后可调用read(fileName)方法读出文件到content中。

因为要使用文件的输入输出,所以可能会抛出IO异常。

2另存为监听器

“文件/另存为”菜单的功能是打开一个保存文件对话框,调用showSaveDialog方法获取文件名,用write(fileName)把content写进文件中。

同时要把    isNamed设置为true,为的是以后点“保存”菜单时不用再打开对话框。

classSaveAsLimplementsActionListener{

 publicvoidactionPerformed(ActionEvente){

 try{

  JFileChooserc=newJFileChooser();

  intrVal=c.showSaveDialog(Notepad.this);

  fileName=c.getSelectedFile().getPath();

  if(rVal==JFileChooser.APPROVE_OPTION){

    content=text.getText();//forinvocatewrite()

    write(fileName);

    isNamed=true;

    setTitle("采摘器"+"--"+fileName);

 }

 if(rVal==JFileChooser.CANCEL_OPTION)

   return;

  }catch(IOExceptionex){

    ex.printStackTrace();

 }

}

}

3保存监听器

“文件/保存”菜单与另存为不同的是:

如果文件名已经有了(用isNamed=true表示),那就直接调用read方法读入文件,如果是未命名,那就打开保存文件对话框。

所以先使用了if(isNamed) write(fileName),其他与“另存为”的都一样。

classSaveLimplementsActionListener{

 publicvoidactionPerformed(ActionEvente){

 try{

  if(isNamed){

   content=text.getText();

   write(fileName);

  }

 else{//isNamedisfalse

 JFileChooserc=newJFileChooser();

  intrVal=c.showSaveDialog(Notepad.this);

  fileName=c.getSelectedFile().getPath();

  if(rVal==JFileChooser.APPROVE_OPTION){

   content=text.getText();//forinvocatewrite()

   write(fileName);

   isNamed=true;

   setTitle("采摘器"+"--"+fileName);

   }

  if(rVal==JFileChooser.CANCEL_OPTION)

   return;

  }//else

 }catch(IOExceptionex){

   ex.printStackTrace();

   }

 }

}

4“新建”监听器

新建文件时只提供一个空白的编辑区,文件名设为"未命名",可写入标记isNamed设为假,待写入内容content置为空白。

classNewLimplementsActionListener{

publicvoidactionPerformed(ActionEvente){

 text.setText("");

 isNamed=false;

 fileName="未命名";

 content="";

 setTitle("采摘器"+"--"+fileName);

 }

}

四完整的源程序代码

//Notepad.java是一个记事本式的采摘器

importjavax.swing.*;

importjava.awt.*;

importjava.awt.event.*;

importjava.awt.datatransfer.*;

importjava.io.*;

importjava.util.*;

importjava.lang.String;

publicclassNotepadextendsJFrame{

privateJTextAreatext=newJTextArea(30,48);

privateJMenuBarmb=newJMenuBar();

privateClipboardclipbd=getToolkit().getSystemClipboard();

privateStringfileName="未命名";

privatebooleanisNamed=false;

privateStringcontent="";//为读写文件用

privateJMenu

file=newJMenu("文件"),

edit=newJMenu("编辑"),

style=newJMenu("格式"),

help=newJMenu("帮助");

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1