软件项目总结报告

软件项目总结报告范文

1引言

1.1编写目的

XXX公司业务管理系统的开发已经基本完成。写此项目开发总结报告,以方便我们在以后的项目开发中来更好的实施项目的订制开发; 让我在今后的项目开发中有更多的有据的资料来规范我们的开发过程和提高我们的开发效率,从而创造更多公司效益。

1.2背景

项目名称:XXX业务管理系统

软件名称:XXX业务系统

客户:XXX

用户:XXX员工

1.3参考资料

项目开发文档:

1.软件开发数据模型:PDM_OperationSystem20070831.pdm

2.数据库开发文档: XXX业务管理系统数据库设计说明书2.0.doc

3.软件业务流程参考:XXX业务管理系统流程说明.doc

4.软件使用手册参考:XXX业务管理系统功能说明3.0.doc

5.软件业务流程参考:XXX业务管理系统流程说明.doc

6.软件中使用到的第三方控件:ComponentArt Web.UI 2006.1252 for asp.net2.0.rar

7.软件中使用的安全Ikey驱动:Ikey Driver.rar

以上参考资料是截止2007-08-31是最新的资料文档。如有修改,即使修改此处的参考文档名称。

2开发工作评价

2.1对生产效率的评价

1.系统开发已历时快1年的时间了

2.开发的反复性比较多。

3.对客户的需求理解不是很透彻。

综合以上,此项目的开发效率不是很高,相反有相当一定时间的浪费。

2.2对产品功能的评价

经过我们公司各位同事的共同努力协作,XXX业务管理系统已经很好的完成了客户的业务流需求。经过对客户使用过程的观察,此项目开发的还是比较成功,但是还是存在着一些问题,造成这些问题的原因是多方面的。如:前期系统数据库的设计缺陷和部分代码的构建缺陷、客户需求的理解上也存在一定问题,这就需要我们用一定的时间来维护客户使用过程中提出的新问题和存在的debug。总的来说,此系统的功能开发还是一个比较成功的案例。

2.3对技术方法的总结

在此项目中使用到技术和工具:

1.使用代码生成器:使用代码生成器 [动软.Net代码自动生成器],此工具在很大程度上提高了编码效率,从而加快了项目的开发进程。在以后的项目中,我们要尽量的来使用一些类似的工具来在最短的时间内完成工作。在今后的项目开发中,我们最好是能开发出适合自己的代码生成工具,更大限度的节省开发周期和开发费用。

2.使用数据库建模工具;PowerDesigner 工具来建立系统数据库模型,以方便程序员很好的理解业务流和掌握系统架构者的架构思想,更好的满足客户的功能需求。在今后的项目开发中,我们要更好的来完成系统的前期数据库模型的建立,最大的来优化系统功能。

3.使用第三方控件:此系统中使用了ComponentArt Web.UI 第三方控件。此控件在很大程度上满足了客户对软件界面的需求,从而也给软件的操作带来了方便。本项目中只使用了ComponentArt Web.UI一种第三方控件,在今后的项目开发过程中,要继续使用第三方的控件。这样以来,无论是针对软件界面的美观性、友好性来说、易操作性而言,还是针对系统开发效率而言,这都是很好途径。但需要意的是:在是使用第三方控件时,要谨慎的选择一些网络中的比较常见的第三方控件。

4.使用自定义控件:此系统中使用了自定义控件(GhdGridView),此自定义控件可以很好的统一系统中的所有信息显示表格样式。如客户对数据显示样式有什么新的意见,我就不需要修改每一个页面的表格样式,我们只需要修改GhdGridView控件的样式,系统中的所有继承自GhdGridView的表格样式都可以改变。

5.系统开发框架:此系统的框架使用的是简单三层结构,此框架在开发一些中小软件是比较实用的。但是我们要是可以开发出自己的框架,把一些通用的功能开发到框架中。这样以来,在以后的系统开发中,针对系统中一些通用的功能就不需要再开发,从而也可以很好的提高我们的开发效率;减少很多维护费用。使我们的技术不断的更加成熟。

6.系统安全加密:此系统中针对客户提出的系统安全问题,我们采用了Ikey加密硬件钥匙来验证客户端登陆客户的合法性,此Ikey钥匙可以绑定到一个系统使用用户,也可以让多个用户来使用一个加密钥匙来验证登陆系统的合法性。这样以来,即使用户的密码不慎丢失,或者被不法人员取得(不法人员他也是无法登陆到我们的系统中来),这样就最大的提高了我们系统的安全性。Ikey加密钥匙是很好的加密B/S架构软件的硬件工具,在以后的软件安全方面可以借鉴。

3项目经验总结

3.1签定合同

一个项目的开发成败或者说项目开发带来效益的大小,在很大程度上是受项目合同签定的影响的。往往,很多一部分公司与客户签定的项目合同都是很模糊的,也很难签定的比较清楚,这样以来就会导致在项目的开发后期,工作两会越来越大,影响项目的竣工周期;而且,项目的开发费用一般是不会变的。这样以来,我们就大大的降低了我们的开发效益。虽然需求范围很难签定的明确,但是我们在签定合同时,要尽量的去把合同功能边界和添加新功能的条件签定。

3.2开发团队

在项目确立后,要尽快的建立起项目开发团队。

项目团队成员的团结合作、相互沟通是非常重要的,团队成员之间要相互学习彼此的优点和技术,使团队的能力不断的提高。这样,在项目的开发过程中,团队才不会被难题困住不动。另外,团队中要有一个项目负责人,这个人无论是在与客户的沟通上,还是在技术上都要是很出众的人,此项目负责人要能很好的沟通客户与开发成员之间,以此来更好的理解客户的功能需求。人的记忆力总是有限的,所以就要求开发团队成员要尽量的书写一些开发文档,这些文档往往是我们在项目开发后期要用到的可寻资料。项目团队士气是项目成功的一个因素,我们需要不断的来培养我们的团队气势,使我们的团队不断的壮大。

3.3需求的调研

在项目确立后,就到了需求调研分析阶段。

1.项目组对客户的整体组织结构、公司有关人员的关系、职责等如果没有一个很好、足够的了解掌握,这样项目组就无法很好的完整的整理到客户的需求、或者说客户真实的功能需求,如此以来我们就为自己埋下了地雷,影响项目的开发周期,这就要求我们要与客户搞好无论是工作上的还是生活上的朋友关系,要深入的去了解客户需求。

2.我们要尽量的让客户也参与到项目的开发团队中来,也就是说我们要使客户把自己也纳入到项目的开发团队中来,如此一来,我们掌握客户需求的真实性、可靠性就会大大的提高,也就不会为项目的后期功能开发埋下陷阱

3.在需求调研过程中,如果缺乏足够用户参与,这样的需求调研也是失败的。很多程序员不愿参与到客户的需求调研中去,为什么呢?很简单,与客户沟通不如与代码沟通容易有意思。尽管这样,我们还是必须用足够多的时间去和客户进行沟通,了解他们真实的需求。很多用户也是如此,他们自己也不愿意参与到项目的需求调研中来,为什么呢?需求调研有出去和朋友一块烂漫对吗。。。虽然现状如此,我们还是要努力的使客户参与到需求的调研中来。

4.模糊需求,也就是模棱两可是需求规格说明中最为可怕的问题。一是指诸多客户对需求说明产生了不同的理解;一是指单个读者能用不止一个方式来解释某个需求说明。针对对这种情况,就要求我们的调研人员要能够从多个角度来分析客户的不同需求,整理出最终的需求与客户确认,定出最终真实可靠的需求,我们绝不能凭借我们自己的单面理解来定立客户

的最终需求。

5.在一个项目的开发中,文档的书写是极为中要的一项工作。因为,某些文档就是我们在开发后期与客户沟通的可寻依据、也是我们程序员在编码过程中要用到的重要文档。我们绝对不能认为,凭借我们的大脑来记录所有的开发需求。。。;即使,你说你是天才,你要用你那颗爱因斯坦的大脑来记录所有的开发需求,那也是不可能的,人的精力总是有限的。这就要求我们在需求调研中做好需求文档的记录和整理。

6.需求调研工具选择,客户一般对图形还是比较感兴趣的,所以我们在调研过程中,我要尽量的采用图形化界面来和客户沟通需求。比如可以采用Rose工具,把客户的意思转换为用例图、时序图、协作图、状态图、类图等,使表达的意思更加直观。这样客户会更快的进行问题的实质。

3.5做好开发计划

在项目确立后,我们就需要做好项目开发计划,需求调研用时,开发用时,测试用时,实施用时,维护用时。在我们做好了计划后,我们要随时的跟踪计划任务的完成进度,从而使我们的项目进度掌控在我们的开发周期范围之内,今日计划、行动,明日成功。

3.5很好的沟通

在其他行业中,人与人的之间的沟通只很重要的。项目开发也不例外,很好的沟通能够加快项目的进度,这就要求我们每一个开发人员要学会和善于沟通于客户和同事之间。在一个项目的开发过程中,我们与客户的沟通是一个不断交流和沟通的过程。在开发到一定的阶段,我们就需要和客户沟通已有功能,尽量的去避免一些隐藏的问题,及时的发现问题,解决问题,从而按时或者提前完成项目的开发。

3.6做好工作总结

在项目进行的过程中,我们要不断去整理自己的工作情况和做好总结,这样以来,无论是在自己的技术还是其它方面,都会对我们有很大的提高,在长期的积累后,无论是我们个人能力,,还是我们的团队能力都会有很大的提高。

 

第二篇:第四小组《Java项目实训》软件工程系实训总结报告

 

技能实训(课程设计)

总结报告

实训项目    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的语言和强大的编码能力,以及在以后的设计中把程序不断完善。

相关推荐