技能实训(课程设计)
总结报告
实训项目 Java项目实训
系 部 软件工程系
指导老师 朱 堂 勋
日 期 20##-1-5
实训报告撰写注意事项
一、报告内容至少应包括以下项目:
1、具体实训内容;
2、本次实训主要目的;
3、具体日程、实训地点、同组同学、指导老师等;
4、实验操作或技能训练步骤,课程设计还应包括设计任务书、原始参数、计算说明、图纸图表、程序清单等;
5、本次实训的主要收获与体会。
二、其余如报告的具体格式、篇幅等要求,视实训课程的区别由实训任课老师或课程设计指导教师按实训大纲,用《实训指导书》或《课程设计指导书》的形式具体规定。
教务处 实训中心 制
一、实训名称
《编写记事本程序》
二、实训项目的目的和功能
本次实训是对前面学过的所有面向对象的编程思想以及编程方法的一个总结、回顾和实践,因此,开始设计前学生一定要先回顾以前所学的内容,明确本次作业设计所要用到的技术点并到网上搜索以及查阅相关的书籍来搜集资料。通过编写一个基于J2SE的应用系统综合实例,以掌握Java语言编程技巧。
具体要求有以下几点:
1. 问题的描述与程序将要实现的具体功能。
2. 程序功能实现的具体设计思路或框架,并检查流程设计。
3. 代码实现。
4. 程序测试(如程序代码、功能测试、可靠性测试和效率测试等)。
5. 设计小结。
三、实训项目的开发环境和所使用的技术
使用Java核心API技术,利用Eclipse或NetBeans、JBuilder集成开发环境完成实训项目,界面友好,代码的可维护性好,有必要的注释和相应的文档。
四、实训地点、日程、分组情况
实训地点:2栋301机房
分组情况:卢徵(组长)、李晓辉
日 程:
第一阶段:
1.班级分组,选定课题,查阅相关资料 半天
2.划分模块、小组成员分工 半天
3利用CASE工具进行系统设计和分析,并编制源程序 3天
第二阶段:上机调试,修改、调试、完善系统 1天
第三阶段:撰写、上交课程设计报告,上交课程设计作品源程序(每人一份) 1天
五、小组分工
李晓辉:负责代码编写
卢徵:负责程序的测试与调试
文本编辑器的设计和实现
1 实训目的
1.1 实训目的
本次实训是对前面学过的所有面向对象的编程思想以及编程方法的一个总结、回顾和实践,因此,开始设计前学生一定要先回顾以前所学的内容,明确本次作业设计所要用到的技术点并到网上搜索以及查阅相关的书籍来搜集资料。通过编写一个基于J2SE的应用系统综合实例,以掌握Java语言编程技巧。
1.2实训要求
具体要求有以下几点:
1. 问题的描述与程序将要实现的具体功能。
2. 程序功能实现的具体设计思路或框架,并检查流程设计。
3. 代码实现。
4. 程序测试(如程序代码、功能测试、可靠性测试和效率测试等)。
5. 设计小结。
2 文本编辑器系统的分析与设计
2.1 系统功能描述
通过此系统可以实现如下功能:
1、可进行文件的新建、打开、保存、编辑等基本功能。
2、支持复制、剪切和粘贴操作
3、可进行查找和替换操作
2.2 系统模块设计
根据系统自带的文档编辑器的特征设计,包括如下的功能模块:
一、 整体结构框架包括:菜单栏和文档编辑区
二、 每个框架分别包含不同的子框架,各个模块的具体框架:
Ø 菜单栏:文件、编辑、插入、格式、工具、帮助
Ø 菜单栏中各个子菜单功能
文件:新建、打开、保存、另存、退出
编辑:撤销、剪切、复制、粘贴、删除、全选、查找、替换
工具: 字体统计
帮助:版本
Ø 子菜单功能的实现主要的几个功能介绍
1) 打开与另存为:两个窗体调用系统函数直接利用,注意格式的选择
2) 查找:查找内容、查找、查找下一个
Ø 文本编辑区
监视文本内容是否改变、监听光标所在位置
2.3 数据库结构设计
1.程序E-R图
3 主要代码清单
3.1生成菜单栏及菜单项
在窗体初始化时,自动添加菜单及其菜单项,用于在文本编辑器中对文本去内容进行操作,使用for语句循环生成菜单栏和菜单项。
class C extends JFrame { //在文本区域内动态显示输入字符数
String prefix = "下面的文本域里现在共有";//统计窗体字数
public C( ) {
setTitle( prefix + "个字符。" );
final TextArea ta = new TextArea( );
ta.addTextListener( new TextListener( ) {
publicvoid textValueChanged( TextEvent e ) {
setTitle( prefix + ta.getText( ).length( ) + "个字符。" );
}
} );
getContentPane( ).add( ta );
pack( );
setLocation( 200, 200 );//显示窗体大小
setDefaultCloseOperation( EXIT_ON_CLOSE );
setVisible( true );
}
}
publicclass MyNotepad implements ActionListener{
private JFrame frame=new JFrame("我的记事本");
private JTextArea jta=new JTextArea();//文件对话框
private String result="";
privateboolean flag=true;
private File f;
private JButton jb=new JButton("开始");
private JTextField jtf=new JTextField(15);
private JTextField jt=new JTextField(15);
private JButton jbt=new JButton("替换为");
private JButton jba=new JButton("全部替换");
private Icon ic=new ImageIcon("D:\\java课堂笔记\\GUI\\11.gif");
private String value;
privateint start=0;
private JFrame jf=new JFrame("查找");
private JFrame jfc=new JFrame("替换");
@SuppressWarnings("unused")
private JFrame jfc1=new JFrame("文件");
@SuppressWarnings("unused")
private JFileChooser fchooser;
@SuppressWarnings("unused")
private File file;
@SuppressWarnings("unused")
private JCheckBox Checkeb_bold, checkb_italic;
publicvoid addString(JTextArea jta, String addstr) {
int position = jta.getCaretPosition();
String text = jta.getText();
text = text.substring(0, position) + addstr
+ text.substring(position, text.length());
jta.setText(text);
jta.setCaretPosition(position);
}
3.2监听事件处理
注册监听事件,当进行操作时,监听事件活得事件源并选择相应的操作,对不同的事件调用不同的函数,得到文本操作的不同结果。
publicvoid actionPerformed(ActionEvent e) { //单击事件处理方法,单击菜单项
String comm=e.getActionCommand();
if("新建".equals(comm)){
if(!(frame.getTitle().equals("新记事本"))){
if(!flag){
write();
newNew();
}else{
JFileChooser jfc=new JFileChooser("D:\\java课堂笔记");
int returnVal = jfc.showDialog(null,"保存为");
if(returnVal == JFileChooser.APPROVE_OPTION) {//显示打开文本对话框且单击“另存为”按钮
f=jfc.getSelectedFile();
flag=false;
write();
}
}
}elseif(!(jta.getText().isEmpty())){
JFileChooser jfc=new JFileChooser("D:\\java课堂笔记");
int returnVal = jfc.showDialog(null,"保存为");
if(returnVal == JFileChooser.APPROVE_OPTION) {//显示打开文本对话框且单击“保存为”按钮
f=jfc.getSelectedFile();
flag=false;
write();
newNew();
}
}else{
newNew();
}
}elseif("打开".equals(comm)){
JFileChooser jfc=new JFileChooser("D:\\java课堂笔记");
jfc.setDialogType(JFileChooser.OPEN_DIALOG);
int returnVal = jfc.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {//显示打开文本对话框且单击“打开”按钮
f=jfc.getSelectedFile();
frame.setTitle(f.getName());
result=read();
flag=false;
value=result;
jta.setText(result);
}
}elseif("保存".equals(comm)){
JFileChooser jfc=new JFileChooser("D:\\java课堂笔记");
if(flag){
int returnVal = jfc.showDialog(null,"保存为");
if(returnVal == JFileChooser.APPROVE_OPTION) {//显示打开文本对话框且单击“保存为”按钮
f=jfc.getSelectedFile();
flag=false;
write();
}
}else{
write();
}
}elseif("另存".equals(comm)){
JFileChooser jfc=new JFileChooser("D:\\java课堂笔记");
int returnVal = jfc.showDialog(null,"另存");
if(returnVal == JFileChooser.APPROVE_OPTION) {
f=jfc.getSelectedFile();
write();
}
}elseif("退出".equals(comm)){
System.exit(0);
}elseif("撤销".equals(comm)){
jta.setText(value);
}elseif("剪切".equals(comm)){
value=jta.getText();
jta.cut();
}elseif("复制".equals(comm)){
jta.copy();
}elseif("粘贴".equals(comm)){
value=jta.getText();
jta.paste();
}elseif("删除".equals(comm)){
value=jta.getText();
jta.replaceSelection(null);
}elseif("全选".equals(comm)){
jta.selectAll();
}elseif("查找".equals(comm)){
value=jta.getText();
JFileChooser jfc=new JFileChooser("D:\\java课堂笔记");
jfc.setDialogType(JFileChooser.OPEN_DIALOG);
int returnVal = jfc.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {
f=jfc.getSelectedFile();
frame.setTitle(f.getName());
result=read();
flag=false;
value=result;
jta.setText(result);
}
}elseif("替换".equals(comm)){
value=jta.getText();
GridLayout gl=new GridLayout(3,3);
JLabel jl1=new JLabel("查找内容:");
JLabel jl2=new JLabel("替换为:");
jfc.setLayout(gl);
jfc.add(jl1);
jfc.add(jtf);
jfc.add(jb);
jfc.add(jl2);
jfc.add(jt);
jfc.add(jbt);
JLabel jl3=new JLabel();
JLabel jl4=new JLabel();
jfc.add(jl3);
jfc.add(jl4);
jfc.add(jba);
jfc.setLocation(300,300);
jfc.setVisible(true);
}elseif("版本".equals(comm)){
JDialog jd=new JDialog(frame,"关于对话框");
jd.setSize(200,200);
JLabel l=new JLabel("版本:ISBN-8778746121524571746");
jd.add(l,BorderLayout.CENTER);
jd.setLocation(100,200);
jd.setSize(600,600);
jd.setVisible(true);
jd.pack();
jd.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
}elseif("开始".equals(comm)||"下一个".equals(comm)){
String temp=jtf.getText();
int s=value.indexOf(temp,start);
if(value.indexOf(temp,start)!=-1){
jta.setSelectionStart(s);
jta.setSelectionEnd(s+temp.length());
jta.setSelectedTextColor(Color.GREEN);
start=s+1;
jb.setText("下一个");
value=value.substring(s+temp.length());//不能截取字串
}else {
JOptionPane.showMessageDialog(jf, "查找完毕!", "提示", 0, ic);
jf.dispose();
}
}elseif("替换为".equals(comm)){
String temp=jtf.getText();
int s=value.indexOf(temp,start);
if(value.indexOf(temp,start)!=-1){
jta.setSelectionStart(s);
jta.setSelectionEnd(s+temp.length());
jta.setSelectedTextColor(Color.GREEN);
start=s+1;
jta.replaceSelection(jt.getText());
}else {
JOptionPane.showMessageDialog(jf, "查找完毕!", "提示", 0, ic);
jf.dispose();
}
}elseif("全部替换".equals(comm)){
String temp=jta.getText();
temp=temp.replaceAll(jtf.getText(), jt.getText());
jta.setText(temp);
}
elseif("文件".equals(comm)){
jta.requestFocusInWindow();
JFileChooser jfc=new JFileChooser("D:\\java课堂笔记");
jfc.setDialogType(JFileChooser.OPEN_DIALOG);
int returnVal = jfc.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {//选择文件后再执行下面的语句
f=jfc.getSelectedFile();
frame.setTitle(f.getName());
result=read();
flag=false;
value=result;
jta.setText(result);
}
}
elseif("字数统计".equals(comm)){
new C();
}
elseif("字体".equals(comm)){
final JFrame ztsz = new JFrame("字体设置...");//字体设置窗口
//字体
ztsz.setLocation(150, 200);
ztsz.setSize(500,300);
jf.setEnabled(false);//文本编辑窗体不可用!
final JComboBox jc = new JComboBox(
GraphicsEnvironment.getLocalGraphicsEnvironment()
.getAvailableFontFamilyNames());
jc.setLocation(30, 80);
Container c = ztsz.getContentPane();
JPanel jp = new JPanel();
jp.add(jc,new FlowLayout());
//字形
String[] faceString={"正常","粗体","斜体","粗斜体"};
String[] sizeString={"初号","小初","一号","小一","二号","小二",
"三号","小三","四号","小四","五号","小五","六号","小六","七号",
"八号","5","8","9","10","11","12","14","16","18","20","22","24",
"26","28","36","48","72"};
final JComboBox zx = new JComboBox(faceString);
final JComboBox dx = new JComboBox(sizeString);
final JButton sure = new JButton("确定");
sure.addActionListener(this);
final JButton cancel = new JButton("取消");
cancel.addActionListener(this);
jp.add(zx);
jp.add(dx);
jp.add(sure);
jp.add(cancel);
c.add(jp);
ztsz.setVisible(true);
if(e.getSource()=="确定"){
ztsz.setDefaultCloseOperation(ztsz.EXIT_ON_CLOSE);
}
if(e.getSource()=="取消"){
ztsz.setDefaultCloseOperation(ztsz.EXIT_ON_CLOSE);
}
}
}
4 程序运行与测试
4.1文本区功能测试
a) 字体的显示,开始的时候不做任何操作的时候显示的默认值,通过修改字体的属性来修改字体。
b) 对文本事件进行监听,如果文本编辑窗口中如果有事件触发,关闭时能够有必要的信息提示。
c) 状态栏的可以正常显示文本的状态信息。
4.2文件菜单功能测试
文件中的功能测试:
a) 通过文件字符流读取文件,创建缓冲区存储文件流。
b) 当保存文件时,先判断文件是否未被保存过,如果未被保存过,则创建新文件并通过输出流来存储文件,当文件已经保存过再对文件进行修改时,则会提示保存的消息窗体。
c) 另存为是通过不同的方法来创建一个新的文件。
4.3编辑菜单功能测试
复制前 粘贴后
剪切、复制、粘贴功能的实现是在注册监听事件后,对文本去的文字进行操作时,系统调用文本类本身的库函数来处理文本去的文字操作,将选中的文本读入缓冲区。然后再等待不同的操作方法的调用。
4.4工具菜单功能测试
功能描述:
查找需要先生成对应的窗体,使用相应的组件类来创建窗体,使用流布局管理器来对窗体中的各个控件进行布局,对查找和查找下一个按钮注册监听事件并编写相应的处理方法。文本去的文字使用相应的处理方法进行比较和处理,并对光标位置进行判断是否到文本末尾,使用异常处理语句捕获异常并处理。
功能描述:
使用相应的组件类来创建窗体,使用流布局管理器来对窗体中的各个控件进行布局,对替换和清空按钮注册监听事件并编写相应的处理方法。
public String read(){
String temp="";
try {
FileInputStream fis = new FileInputStream(f.getAbsolutePath());
byte[] b=newbyte[1024];
while(true){
int num=fis.read(b);
if(num==-1)break;
temp=temp+new String(b,0,num);
}
fis.close();
} catch (Exception e1) {
e1.printStackTrace();
}
return temp;
}
publicvoid write(){
try {
FileOutputStream fos=new FileOutputStream(f);//创建字符输出流对象
fos.write(jta.getText().getBytes());//向文本输入字符串
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
publicvoid newNew(){
frame.dispose();
new MyNotepad();
flag=true;
}
public MyNotepad(){
JMenuBar jmb=new JMenuBar();
String[] menuLab={"文件","编辑","插入","格式","工具","帮助"};
String[][] menuItemLab={{"新建","打开","保存","另存","退出"},
{"撤销","剪切","复制","粘贴","删除","全选","查找","替换"},{"文件"},
{"字体"},{"字数统计"},{"版本"}};
for(int i=0;i<menuLab.length;i++){
JMenu menu=new JMenu(menuLab[i]);
jmb.add(menu);
for(int j=0;j<menuItemLab[i].length;j++){
JMenuItem jmi=new JMenuItem(menuItemLab[i][j]);
menu.add(jmi);
jmi.addActionListener(this);
}
}
frame.setJMenuBar(jmb);
jta.setLineWrap(true);//自动换行
JScrollPane jsp=new JScrollPane(jta);//滚动窗口面板
frame.add(jsp);
jb.addActionListener(this);
jbt.addActionListener(this);
jba.addActionListener(this);
frame.setLocation(200,50);
frame.setSize(620,660);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
publicstaticvoid main(String[] args) {
new MyNotepad();
}
}
5 实训总结
实训的时间很短,只有短短二周的时间,但是需要完成的工作很多,一个学期的java学习我们所学的并不是很多,本次实训我选取的是文本编辑器的设计。虽然以前在网页中做过实训,要求我们自己做一个网页,而在java中需要用代码来实现窗体的实例化和调用。是要通过代码来实例化和创建窗体,并通过代码来调用,引入了java中的多个类来实现各个窗体和控件,并发现了自己的不足之处。
在编写代码时需要的是我们的细心,因为编写代码是一个烦琐的过程,我们如果一不小心,代码就很容易出现漏词、错词已经缺词,所以我们采用了先完整的思考整个程序的步骤、思想,然后采取分工合作,一个负责代码编写,而另一个负责程序的调试。这样既节省了时间,又提高了效率。同时这样还便于两人对遇到问题时能够加以讨论共同修改。
在窗体中需要加入文本编辑区来存储文本,这就需要创建文本对象并对其进行实例化,并且在编辑菜单中还需要多个方法来实现对文本的操作和处理,比如剪切和复制,用到本身的函数来操作。对于所有的菜单和菜单项以及控件所做才操作处理都需要注册其相应的监听事件来完成,而在文件菜单中,打开的操作用到了文件的输入流,保存则用到了文本的输出流。而在打开事件中所以遇到的错误在查阅了很多资料后在得以解决,并在此过程中学到了很多老师在课程中没有讲到的知识,是自己受益匪浅,在文件菜单中的保存中,需要用if语句进行相应的判断,来执行不同的代码实现,并与相应的异常处理语句相结合来完善程序,使代码具有健壮性和灵活性,减少程序运行时错误出现。
由于时间仓促,还有许多其他的功能没有,并在已实现的功能中也有不足的地方,还需要进一步对其进行修改。再次过程中不断加深对java程序设计的认识和理解,丰富自己的知识,了解自己的不足,加强自己的理解能力和学习能力,提高自己独立解决问题的能力。Java是一门全新的计算机语言,需要自己对其全新的理解,而java的很多功能都需要在学习中去发现和理解,应用到不同的设计中去,并结合网络这个以有利工具方便自己学习java的语言和强大的编码能力,以及在以后的设计中把程序不断完善。