资源描述
Java实训报告电子版
23
2020年4月19日
文档仅供参考
实训报告书
实训名称: Java程序设计实训
系 (部): 信息工程系
专业班级:
学生姓名:
学 号:
指导教师: 张民
完成日期: .12.11
山东科技大学泰山科技学院
实训课题
文本编辑器
实训人姓名
同组人员
实训日期
.12.07至 .12.11
实训成绩
指导教师评语
指导教师签名:______________
_______年 ____ 月____日
……………………………装……………………………………订…………………………………线……………………………
目 录
目 录 1
1 实训目的 2
1.1 实训目的 2
1.2实训要求 2
2 文本编辑器系统的分析与设计 2
2.1 系统功能描述 2
2.2 系统模块设计 2
2.3 数据库结构设计 3
3 主要代码清单 4
3.1生成菜单栏及菜单项 4
3.2监听事件处理 5
4 程序运行与测试 6
4.1文本区功能测试 6
4.2文件菜单功能测试 6
4.3编辑菜单功能测试 7
4.4工具菜单功能测试 11
5 实训总结 14
文本编辑器的设计和实现
1 实训目的
1.1 实训目的
《Java程序设计实训》是计算机专业一门重要的专业技术基础实践课程。为了能够较好的完成实训任务,学生应具备软件开发技术的基础知识,实训的主要目的在于将理论与实际应用相结合,使用程序设计语言java,以及相关软件设计开发知识完成软件的设计开发任务。本实训课程将为整个专业的学习以及软件设计水平的提高打下良好的基础,提高学生项目分析、设计、编写、调试和测试的能力,并培养基本的、良好的团队合作能力。
1.2实训要求
实训中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,经过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握软件开发技术,提高分析、解决实际问题的能力
本次实训要求在学生能够较熟练使用java程序设计语言进行软件代码的编写,同时还要具备较好的项目分析的能力,加深对相关课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
2 文本编辑器系统的分析与设计
2.1 系统功能描述
经过此系统能够实现如下功能:
1)可进行文件的新建、打开、保存、编辑等基本功能。
2)支持复制、剪切和粘贴操作
3)可进行查找和替换操作
2.2 系统模块设计
根据系统自带的文档编辑器的特征设计,包括如下的功能模块:
一、 整体结构框架包括:菜单栏和文档编辑区
二、 每个框架分别包含不同的子框架,各个模块的具体框架:
Ø 菜单栏:文件、编辑、工具
Ø 菜单栏中各个子菜单功能
文件:新建、打开、保存、另存为、退出
编辑:剪切、复制、粘贴
工具: 查找、替换
Ø 子菜单功能的实现主要的几个功能介绍
1) 打开与另存为:两个窗体调用系统函数直接利用,注意格式的选择
2) 查找:查找内容、查找、查找下一个
Ø 文本编辑区
监视文本内容是否改变、监听光标所在位置
2.3 数据库结构设计
1.程序E-R图
菜单栏
文件
编辑
工具
文件
新建
打开
保存
另存为
退出
编辑
剪切
复制
粘贴
工具
查找
替换
3 主要代码清单
3.1生成菜单栏及菜单项
public void addmyMenu() // 菜单函数,生成菜单
{
JMenuBar menubar = new JMenuBar();// 菜单栏添加若干菜单
this.setJMenuBar(menubar);
String menustr[] = { "文件", "编辑", "工具", "帮助" };//菜单栏字符串数组
JMenu menu[] = new JMenu[menustr.length];
for (int i = 0; i < menu.length; i++) {//为菜单栏赋值
menu[i] = new JMenu(menustr[i]);
menubar.add(menu[i]);
}
String menuitemstr0[] = { "新建", "打开", "保存", "另存为", "退出" };// 文件菜单中添加若干菜单项
JMenuItem menuitem0[] = new JMenuItem[menuitemstr0.length];
for (int i = 0; i < menuitem0.length; i++) {//为文件菜单赋值
menuitem0[i] = new JMenuItem(menuitemstr0[i]);
menu[0].add(menuitem0[i]);
menuitem0[i].addActionListener(this);// 为每个菜单项注册监听事件
}
String menuitemstr1[] = { "剪切", "复制", "粘贴" };// 编辑菜单中添加若干菜单项
JMenuItem menuitem1[] = new JMenuItem[menuitemstr1.length];
for (int i = 0; i < menuitem1.length; i++) {
menuitem1[i] = new JMenuItem(menuitemstr1[i]);
menu[1].add(menuitem1[i]);
menuitem1[i].addActionListener(this);// 为每个菜单项注册监听事件
}
String menuitemstr2[] = { "查找", "替换" };// 工具菜单中添加若干菜单项
JMenuItem menuitem2[] = new JMenuItem[menuitemstr2.length];
for (int i = 0; i < menuitem2.length; i++) {
menuitem2[i] = new JMenuItem(menuitemstr2[i]);
menu[2].add(menuitem2[i]);
menuitem2[i].addActionListener(this);// 为每个菜单项注册监听事件
}
JMenuItem menuitemstr3 = new JMenuItem("帮助");// 帮助菜单中添加帮助菜单项
menu[3].add(menuitemstr3);
menuitemstr3.addActionListener(this);// 注册监听事件
}
3.2监听事件处理
注册监听事件,当进行操作时,监听事件活得事件源并选择相应的操作,对不同的事件调用不同的函数,得到文本操作的不同结果。
class MyItemListener_font implements ItemListener { //字体监听器
public void itemStateChanged(ItemEvent e) {
id_font = ((java.awt.List)e.getSource()).getSelectedIndex();
switch( id_font){
case 0:{
ta.setFont(new Font("Times New Roman",Font.PLAIN ,ta.getFont().getSize()) );//普通文字
break;}
case 1:{
ta.setFont(new Font("Times New Roman" , Font.BOLD ,ta.getFont().getSize()) );//粗体文字
break;
}
case 2:{
ta.setFont(new Font("Times New Roman" , Font.ITALIC ,ta.getFont().getSize()) );//斜体文字
break;
}}}}
4 程序运行与测试
4.1文本区功能测试
a) 字体的显示,开始的时候不做任何操作的时候显示的默认值,经过修改字体的属性来修改字体。
b) 对文本事件进行监听,如果文本编辑窗口中如果有事件触发,关闭时能够有必要的信息提示。
c) 状态栏的能够正常显示文本的状态信息。
4.2文件菜单功能测试
文件中的功能测试:
a) 经过文件字符流读取文件,创立缓冲区存储文件流。
b) 当保存文件时,先判断文件是否未被保存过,如果未被保存过,则创立新文件并经过输出流来存储文件,当文件已经保存过再对文件进行修改时,则会提示保存的消息窗体。
c) 另存为是经过不同的方法来创立一个新的文件。
附:
打开与保存代码:
miSave.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
if( fileName.equals("") ){ //如果文件没有被保存过,即文件名为空
FileDialog d=new FileDialog(mainFrame , "save file" , FileDialog.SAVE );//保存文件对话框
d.addWindowListener( new WindowAdapter(){ //关闭文件对话框窗口
public void windowClosing(WindowEvent ee){
System.exit(0);
}
});
d.setVisible(true);
String s = ta.getText();//得到所输入的文本内容
try//异常处理
{
File f = new File( d.getDirectory()+d.getFile());//新建文件
fileName = d.getDirectory()+d.getFile();//得到文件名
BufferedWriter bw = new BufferedWriter( new FileWriter (f));//输入到文件中
bw.write(s , 0 , s.length());
bw.close();
}
catch(FileNotFoundException fe_){
System.out.println("file not found");
System.exit(0);
}
catch( IOException ie_)
{
System.out.println(" IO error");
System.exit(0);
}
}
else //如果文件已经保存过
{
String s = ta.getText();//得到所输入的文本内容
try//异常处理
{
File f = new File( fileName );//新建文件
BufferedWriter bw = new BufferedWriter( new FileWriter (f));//输入到文件中
bw.write(s , 0 , s.length());
bw.close();
}
catch(FileNotFoundException fe_){
System.out.println("file not found");
System.exit(0);
}
catch( IOException ie_)
{
System.out.println(" IO error");
System.exit(0);
}
}
});
//另存为
miSaveAs.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
FileDialog d=new FileDialog(mainFrame , "save file" , FileDialog.SAVE );//保存文件对话框
d.addWindowListener( new WindowAdapter(){ //关闭文件对话框窗口
public void windowClosing(WindowEvent ee){
System.exit(0);
}
});
d.setVisible(true);
String s = ta.getText();//得到所输入的文本内容
try//异常处理
{
File f = new File( d.getDirectory()+d.getFile());//新建文件
BufferedWriter bw = new BufferedWriter( new FileWriter (f));//输入到文件中
bw.write(s , 0 , s.length());
bw.close();
}
catch(FileNotFoundException fe_){
System.out.println("file not found");
System.exit(0);
}
catch( IOException ie_)
{
System.out.println(" IO error");
System.exit(0);
} }});
4.3编辑菜单功能测试
复制前 粘贴后
剪切前 剪切后
剪切、复制、粘贴功能的实现是在注册监听事件后,对文本去的文字进行操作时,系统调用文本类本身的库函数来处理文本去的文字操作,将选中的文本读入缓冲区。然后再等待不同的操作方法的调用。
附录:
miCut.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e){
tempString = ta.getSelectedText(); ///得到要复制的内容,暂存在tempString中
StringBuffer tmp = new StringBuffer ( ta.getText());//临时存储文本
int start = ta.getSelectionStart(); //得到要删除的字符串的起始位置
int len = ta.getSelectedText().length(); //得到要删除的字符串的长度
tmp.delete( start , start+len); ///删除所选中的字符串
ta.setText(tmp.toString());//用新文本设置原文本
}
});
//复制
miCopy.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e){
tempString = ta.getSelectedText(); ///得到要复制的内容,暂存在tempString中
}
})
//粘贴
miPaste.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e){
StringBuffer tmp = new StringBuffer ( ta.getText());//临时存储文本
int start = ta.getSelectionStart(); //得到要粘贴的位置
tmp.insert(start , tempString);//查入要粘贴的内容
ta.setText(tmp.toString());//用新文本设置原文本
}
});
//删除
miDelete.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e){
StringBuffer tmp = new StringBuffer ( ta.getText());//临时存储文本
int start = ta.getSelectionStart(); //得到要删除的字符串的起始位置
int len = ta.getSelectedText().length(); //得到要删除的字符串的长度
tmp.delete( start , start+len); ///删除所选中的字符串
ta.setText(tmp.toString());//用新文本设置原文本
}
});
4.4工具菜单功能测试
功能描述:
查找需要先生成对应的窗体,使用相应的组件类来创立窗体,使用流布局管理器来对窗体中的各个控件进行布局,对查找和查找下一个按钮注册监听事件并编写相应的处理方法。文本去的文字使用相应的处理方法进行比较和处理,并对光标位置进行判断是否到文本末尾,使用异常处理语句捕获异常并处理。
功能描述:
替换也是需要先生成相应的窗体,使用相应的组件类来创立窗体,使用流布局管理器来对窗体中的各个控件进行布局,对替换和清空按钮注册监听事件并编写相应的处理方法。
附:
查找替换函数处理代码:
public void find()// 查找函数
{
find.setSize(300, 100);
find.setLocation(this.getX()+50, this.getY()+50);
find.setResizable(false);
find.setLayout(new FlowLayout());//窗体流布局
Label label1 = new Label("查找内容");
Button button1 = new Button("查找");
Button button2 = new Button("查找下一个");
find.add(label1);
find.add(ltext1);
find.add(button1);
find.add(button2);
//注册按钮的监听事件
button1.addActionListener(new ActionListener() {//查找按钮事件方法
public void actionPerformed(ActionEvent e) {
if (ltext1.getText() == "")
;
else {
int locate = text.getText().indexOf(ltext1.getText(), 0);
text.select(locate, locate + ltext1.getText().length());
fromindex = locate + ltext1.getText().length();
}
}
});
button2.addActionListener(new ActionListener() {//查找下一个按钮方法
public void actionPerformed(ActionEvent e) {
int locate = 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(new WindowAdapter() { // 关闭对话框窗口
public void windowClosing(WindowEvent ee) {
find.dispose();
}
});
find.show();
find.removeAll();
}
public void replace()// 替换函数
{
replace.setSize(200, 200);
replace.setLocation(this.getX()+50, this.getY()+50);
replace.setResizable(false);
replace.setLayout(new FlowLayout());
Label label_1 = new Label(" 查找内容");
Label label_2 = new Label(" 替换为 ");
Button button_1 = new Button(" 替换 ");
Button button_2 = new Button(" 清空 ");
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(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (ltext2.getText() == "")
;
else {
int locate = 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(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ltext2.setText("");
ltext3.setText("");
}
});
replace.addWindowListener(new WindowAdapter() { // 关闭对话框窗口
public void windowClosing(WindowEvent ee) {
replace.dispose();
}
});
replace.show();
replace.removeAll();
}
5 实训总结
实训很快就结束了,当你认真的去完成一件事的时候,你就会发现时间过的很快。有些问题还没解决,有些知识还没有弄懂那个,时间短任务重。本次实训老师给出了三个题目,由于任务中,我们选择了其中一个项目,文本编辑器。以前在.net中做过实训,跟java一样需要用代码来实现窗体的实例化和调用。经过代码来实例化和创立窗体,并经过代码来调用,引入了java中的多个类来实现各个窗体和控件,以为很简单,可是实际做出来还是有很多不一样的。
在窗体中需要加入文本编辑区来存储文本,这就需要创立文本对象并对其进行实例化,而且在编辑菜单中还需要多个方法来实现对文本的操作和处理,比如剪切和复制,用到本身的函数来操作。对于所有的菜单和菜单项以及控件所做才操作处理都需要注册其相应的监听事件来完成,而在文件菜单中,打开的操作用到了文件的输入流,保存则用到了文本的输出流。
实训结束了,我们还有很多功能没有实现,在已经实现的功能中还有很多不完善的地方。当然我想自己更多的是兴奋和一点点的成就感。现在我觉得,学习JAVA要不断的复习和运用,做到举一反三,将所学知识充分融入到平时的学习生活中去,从而为以后的工作打好坚实的基础。感谢学校和老师能够为我们提供这次机会,让我们更好的掌握和了解JAVA这门语言。经过这次实训,我真的从中学到了很多东西。同学间的互相帮助,能让你的进度加倍。是兴奋和一点点的成就感。现在我觉得,学习JAVA要不断的复习和运用,做到举一反三,将所学知识充分融入到平时的学习生活中去,从而为以后的工作打好坚实的基础。感谢学校和老师能够为我们提供这次机会,让我们更好的掌握和了解JAVA这门语言。 经过这次实训,我真的从中学到了很多东西。我对这个介于人类与非人类之间的计算机编程语言有了较上学期更进一步的认识。其间开心过、郁闷过、无奈过、彷徨过……随着实训的圆满成功与实验报告的顺利完成,有点微微的自豪感使人难忘。至于我做的程序,还不是很完善,因此我将一直去完善它,不断地学习下去。伴随着学习的深入,我发现高深的东西还有很多很多,等待着我自己去发掘。
展开阅读全文