menuitem2[i]=newJMenuItem(menuitemstr2[i]);
menu[2].add(menuitem2[i]);
menuitem2[i].addActionListener(this);//为每个菜单项注册监听事件
}
JMenuItemmenuitemstr3=newJMenuItem("帮助");//帮助菜单中添加帮助菜单项
menu[3].add(menuitemstr3);
menuitemstr3.addActionListener(this);//注册监听事件
}
3.2监听事件处理
注册监听事件,当进行操作时,监听事件活得事件源并选择相应的操作,对不同的事件调用不同的函数,得到文本操作的不同结果。
publicvoidactionPerformed(ActionEvente)//监听事件处理函数
{
if(e.getSource()instanceofJMenuItem)//判断事件是否来自于菜单项
{
if(e.getActionCommand()=="新建"){
FileName="未命名1";
text.replaceRange("",0,text.getText().length());
}
if(e.getActionCommand()=="打开"){
open();//执行打开函数
}
if(e.getActionCommand()=="保存"){
save();//执行保存函数
}
if(e.getActionCommand()=="另存为"){
saveother();//执行另存为函数
}
if(e.getActionCommand()=="退出")
System.exit(0);//系统退出
if(e.getActionCommand()=="剪切")
text.cut();//剪切
if(e.getActionCommand()=="复制")
text.copy();//复制
if(e.getActionCommand()=="粘贴")
text.paste();//粘贴
if(e.getActionCommand()=="查找"){
find();//执行查找函数
}
if(e.getActionCommand()=="替换"){
replace();//执行替换函数
}
if(e.getActionCommand()=="帮助"){//帮助消息窗体
JOptionPane.showMessageDialog(this,
"该记事本程序属于个人所编写,由于时间仓促,难免有不足之处仅供初学者使用!
","帮助",
JOptionPane.PLAIN_MESSAGE);
}
}
}
4程序运行与测试
4.1文本区功能测试
a)字体的显示,开始的时候不做任何操作的时候显示的默认值,通过修改字体的属性来修改字体。
b)对文本事件进行监听,如果文本编辑窗口中如果有事件触发,关闭时能够有必要的信息提示。
c)状态栏的可以正常显示文本的状态信息。
4.2文件菜单功能测试
文件中的功能测试:
a)通过文件字符流读取文件,创建缓冲区存储文件流。
b)当保存文件时,先判断文件是否未被保存过,如果未被保存过,则创建新文件并通过输出流来存储文件,当文件已经保存过再对文件进行修改时,则会提示保存的消息窗体。
c)另存为是通过不同的方法来创建一个新的文件。
附:
打开与保存代码:
publicvoidopen()//打开函数
{
FileDialogopen=newFileDialog(mainFrame,"打开",FileDialog.LOAD);
open.setVisible(true);
Filefile=newFile(open.getDirectory()+open.getFile());
Stringpath=file.getPath();//获得文件的路径
charFrist=path.charAt(0);//获取文件的第一个字符
if(Frist!
='n'){//判断是否为空
FileName=open.getDirectory()+open.getFile();//获取文件名
charch[]=null;
try{
ch=newchar[(int)file.length()];
BufferedReaderbr=newBufferedReader(newFileReader(file));//文件度缓冲区
br.read(ch);//读文件
br.close();
}catch(FileNotFoundExceptionfe)//捕获异常
{
JOptionPane.showMessageDialog(this,"文件没有打开!
");//显示消息提示窗口
System.exit(0);
}catch(IOExceptionie)//捕获异常
{
System.out.println("IOerror");
System.exit(0);
}
this.setTitle(FileName);//将窗体标题赋值为文件名
Stringtempo=newString(ch);//将字符数组赋值给字符串
text.setText(tempo);//文本显示区显示
}
}
publicvoidsave()//保存函数
{
if(FileName.equals("未命名1"))//判断是否保存过
{
FileDialogsave=newFileDialog(mainFrame,"保存",FileDialog.SAVE);
save.setVisible(true);
Stringtemps=text.getText();//获取文本去文字并复制给字符串temps
try//异常处理
{
Filef=newFile(save.getDirectory()+save.getFile());//新建文件
FileName=save.getDirectory()+save.getFile();//得到文件名
BufferedWriterbw=newBufferedWriter(newFileWriter(f));//输入到文件中
bw.write(temps,0,temps.length());//新文件写入
bw.close();
}catch(FileNotFoundExceptionfe_){
System.out.println("filenotfound");
System.exit(0);
}catch(IOExceptionie_){
System.out.println("IOerror");
System.exit(0);
}
}
else//如果文件已经保存过
{
Strings=text.getText();//得到所输入的文本内容
try//异常处理
{
Filef=newFile(FileName);//新建文件
BufferedWriterbw=newBufferedWriter(newFileWriter(f));//输入到文件中
bw.write(s,0,s.length());
bw.close();
JOptionPane.showMessageDialog(this,"保存成功");
}catch(FileNotFoundExceptionfe_){
System.out.println("filenotfound");
System.exit(0);
}catch(IOExceptionie_){
System.out.println("IOerror");
System.exit(0);
}
}
}
4.3编辑菜单功能测试
复制前粘贴后
剪切前剪切后
剪切、复制、粘贴功能的实现是在注册监听事件后,对文本去的文字进行操作时,系统调用文本类本身的库函数来处理文本去的文字操作,将选中的文本读入缓冲区。
然后再等待不同的操作方法的调用。
4.4工具菜单功能测试
功能描述:
查找需要先生成对应的窗体,使用相应的组件类来创建窗体,使用流布局管理器来对窗体中的各个控件进行布局,对查找和查找下一个按钮注册监听事件并编写相应的处理方法。
文本去的文字使用相应的处理方法进行比较和处理,并对光标位置进行判断是否到文本末尾,使用异常处理语句捕获异常并处理。
功能描述:
替换也是需要先生成相应的窗体,使用相应的组件类来创建窗体,使用流布局管理器来对窗体中的各个控件进行布局,对替换和清空按钮注册监听事件并编写相应的处理方法。
附:
查找替换函数处理代码:
publicvoidfind()//查找函数
{
find.setSize(300,100);
find.setLocation(this.getX()+50,this.getY()+50);
find.setResizable(false);
find.setLayout(newFlowLayout());//窗体流布局
Labellabel1=newLabel("查找内容");
Buttonbutton1=newButton("查找");
Buttonbutton2=newButton("查找下一个");
find.add(label1);
find.add(ltext1);
find.add(button1);
find.add(button2);
//注册按钮的监听事件
button1.addActionListener(newActionListener(){//查找按钮事件方法
publicvoidactionPerformed(ActionEvente){
if(ltext1.getText()=="")
;
else{
intlocate=text.getText().indexOf(ltext1.getText(),0);
text.select(locate,locate+ltext1.getText().length());
fromindex=locate+ltext1.getText().length();
}
}
});
button2.addActionListener(newActionListener(){//查找下一个按钮方法
publicvoidactionPerformed(ActionEvente){
intlocate=text.getText()
.indexOf(ltext1.getText(),fromindex);
if(locate==-1)
ltext1.setText("已查找到文件末尾!
");
else{
text.select(locate,locate+ltext1.getText().length());
fromindex=locate+ltext1.getText().length();
}
}
});
find.addWindowListener(newWindowAdapter(){//关闭对话框窗口
publicvoidwindowClosing(WindowEventee){
find.dispose();
}
});
find.show();
find.removeAll();
}
publicvoidreplace()//替换函数
{
replace.setSize(200,200);
replace.setLocation(this.getX()+50,this.getY()+50);
replace.setResizable(false);
replace.setLayout(newFlowLayout());
Labellabel_1=newLabel("查找内容");
Labellabel_2=newLabel("替换为");
Buttonbutton_1=newButton("替换");
Buttonbutton_2=newButton("清空");
replace.add(label_1);
replace.add(ltext2);
replace.add(label_2);
replace.add(ltext3);
replace.add(button_1);
replace.add(button_2);
//注册按钮的监听事件
button_1.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
if(ltext2.getText()=="")
;
else{
intlocate=text.getText().indexOf(ltext2.getText(),0);
text.select(locate,locate+ltext2.getText().length());
text.replaceRange(ltext3.getText(),locate,locate
+ltext2.getText().length());
}
}
});
button_2.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
ltext2.setText("");
ltext3.setText("");
}
});
replace.addWindowListener(newWindowAdapter(){//关闭对话框窗口
publicvoidwindowClosing(WindowEventee){
replace.dispose();
}
});
replace.show();
replace.removeAll();
}
5实训总结
实训的时间很短,只有短短一周的时间,但是需要完成的工作很多,一个学期的java学习我们所学的并不是很多,本次实训我选取的是文本编辑器的设计。
虽然以前在c#中做过实训,但是c#是在图形用户界面中进行窗体的设计,是对窗体和Windows控件的操作,而在java中需要用代码来实现窗体的实例化和调用。
是要通过代码来实例化和创建窗体,并通过代码来调用,引入了java中的多个类来实现各个窗体和控件,并发现了自己的不足之处。
在窗体中需要加入文本编辑区来存储文本,这就需要创建文本对象并对其进行实例化,并且在编辑菜单中还需要多个方法来实现对文本的操作和处理,比如剪切和复制,用到本身的函数来操作。
对于所有的菜单和菜单项以及控件所做才操作处理都需要注册其相应的监听事件来完成,而在文件菜单中,打开的操作用到了文件的输入流,保存则用到了文本的输出流。
而在打开事件中所以遇到的错误在查阅了很多资料后在得以解决,并在此过程中学到了很多老师在课程中没有讲到的知识,是自己受益匪浅,在文件菜单中的保存中,需要用if语句进行相应的判断,来执行不同的代码实现,并与相应的异常处理语句相结合来完善程序,是代码哥哥具有健壮性和灵活性,减少程序运行时错误出现。
在查找和替换中,对于查找函数则需要判断许多不同的情况来进行不同,尤其是要如何实现查找和替换的功能是最关键的,需要使用什么样的方法来达到这一目的是最困难的,通过网络和同学的讨论发现很多同学也遇到了这个问题,而采用现成的代码是行不通的,必须自己在实现中进行一次次的修改,不断调整代码的运行方式来实现其功能。
由于时间仓促,还有许多其他的功