英汉电子词典
一、需求分析
二十世纪后半叶,以电子计算机为代表的现代科学获得了突飞猛进的发展并迅速和人们的日常生活结合在一起。计算机技术的发展和进步也使电子语言词典的诞生成为可能。
我们日常的学习生活中,常会遇到这样的问题:在工作时或在网上冲浪,或者电子邮箱中收到一封外国朋友发的英文E-mail,遇到某些陌生的单词,可又疲于去翻查厚重的英文字典时,电脑中所安装的英汉电子词典便成为了最为方便、快捷的选择。电子词典是一种多功能的词典类工具软件,它可以即时翻译,快速、准确、详细地查阅英文单词,或将中文单词进行英文翻译,使自己的知识面拓展得更宽、更广。
尽管电子词典只有十来年的历史,但它却已经发展壮大,成为词典家族中具有旺盛生命力的一员。虽然目前它尚不足以取代传统词典,但在英语学习和教学中,由于它实用、快捷、准确、经济等特点,已经成为传统英汉词典的有力竞争者,并对传统的词典提出了挑战。
本系统是一个采用Microsoft Access作为数据库,用JAVA作为开发工具的英汉电子词典,内有英汉词典、汉英词典和备份词库。它不仅可实现英译汉、汉译英的基本翻译功能,还可以让用户根据自己的需要添加、修改、删除词库,形成自己的词库。其功能结构图如图1.1所示:
图1.1 功能结构图
功能模块说明:
1、英译汉功能模块说明:可以实现对英文单词对中文单词的查询功能。用户文本框中输入要查询的英语单词。若该单词存在于词库中,则会在文件对话框中显示其词性及中文翻译;若该单词没有存在于词库中,则会弹出“警告”,说明“查无此词”;若没有输入直接点击“查询”,则会弹出“警告”,说明“查询对象不能为空”。
2、汉译英功能模块说明:可以实现对中文单词对英文单词的查询功能。用户可在文本框中输入要查询的中文单词。若该单词存在于词库中,则会在文件对话框中显示一个或多个对应的英文;若该单词没有存在于词库中,则会弹出“警告”,说明“查无此词”;若没有输入直接点击“查询”,则会弹出“警告”,说明“查询对象不能为空”。
3、备份词库功能模块说明:可以实现对现有词库的备份,可将当前词库存入用户所设置的任一位位置。
4、添加词汇功能模块说明:可以实现对词库的添加。用户可自行输入所添加的单词及其解释,若添加的是词库中没有的单词,系统在添加成功后有提示“添加成功”;若添加的是词库中已有的单词,系统会弹出“警告”,说明“此词汇已存在”。
5、修改词汇功能模块说明:可以实现对词库中已有单词的修改。用户可自行修改词库中的单词的解释,若输入单词不存在于词库中,系统会弹出“警告”,说
明“不存在此单词”。
6、删除词汇功能模块说明:可以删除词库中已有的单词。用户可自行删除词库中已有的单词,在删除此单词的同时,其解释也会随之被删除,若输入单词不存在于词库中,系统会弹出“警告”,说明“不存在此单词”。
7、其它功能模块说明:在帮助中有“帮助”与“关于”两项,“帮助”中有关于词典的功能说明,“关于”可显示版本信息。
二、概要设计
1、英语词典设计要求
分析词典的主要功能,设计实现如下功能:
(1)实现程序GUI图形界面;
(2)实现与词典数据库的访问;
(3)实现文件的输入、输出;
(4)实现鼠标或键盘事件响应模块。
2、自定义类说明
(1) public class Dic{}
自定义主体main函数的类,用来调用各种类
(2)class DataWindow extends JFrame implements ActionListener{}
自定义一个主窗体类,用来显示整个窗体。
继承的父类: JFrame类
实现的接口: ActionListener
(3)class AddWin extendsJFrame implements ActionList ener{}
自定义一个添加窗口类,用于添加新的单词及其解释
(4)DelWin extends JFrame implements ActionListene
r{}
自定义一个删除窗口类,用于删除词库中所存在的单词及其解释(5) ModifyWin extendsJFrame implements ActionListe ner{}
自定义一个修改窗口类,用于修改词库中所存在的单词及其解释
(6) class HelpFrame extends JFrame {}
自定义一个帮助窗口类,用不可编辑的文本域的窗体对该词典的功能做简要的说明
3、界面设计思想
创建窗体,设计菜单。定义菜单条JMenu mfile(文件)、medit(编辑)、mhelp(帮助),菜单子项JMenuItem edic(英汉词典)、cdic(汉英词典)、back_data(备份词库)、quit(退出)、addedit(添加词汇)、modedi (修改词汇)、deledit(删除词汇)、hhelp(帮助)、about(关于)。通过add( )方法将菜单子项添加到菜单中,并注册监听者。定义一个文件对话框,并为之增加适配器。自定义一个面板,实现GUI元素的布局。
4、方法定义说明
(1)定义方法actionPerformed(),内用if语句实现按钮监听: public void actionPerformed(ActionEvent e)
(2)定义方法Listwords(),实现查询功能
public void Listwords()throws SQLException(3)定义方法删除(),实现删除功能
public void 删除()throws SQLException
(4)定义方法添加(),实现添加功能
publicvoid 添加() throws SQLException
(5)定义方法修改(),实现修改功能
public void 修改()throws SQLException
5、数据库说明
Java数据库连接(JDBC)由一组用Java 编程语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化。本系统采用的是Access数据库的连接方式,Access数据库使用ODBC直连方式如下:
加载驱动程序:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
与数据库建立连接:
Stringurl="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
Connectionconn = DriverManager.getConnection(url,"","");
创建JDBC Statement对象:
StatementstmtNew=conn.createStatement() ;
注意:首先要配置数据源:
控制面版->管理工具->数据源->系统DSN->添加->选择Microsort Access Drive(*.mdb)->完成->写个数据源名(随意)->选择->找到你的access文件->确定,接下来再进行你的操作。
三、详细设计
本系统是通过对类对象的引用,以及函数的调用实现类之间的连接的。创建窗体,GUI(标签,文本框,按钮),用add( )方法加入容器,进而进行布局,用addActionListener( )方法为按钮或者菜单条按钮注册事件监听者,通过监听者方法调用(事件源,处理代码)对按钮触发。
1、添加功能的实现:
public void 添加() throws SQLException{
? String cname,ename;
? try
{ class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); ???} catch(ClassNotFoundException e){}
?Con = DriverManager.getConnection("jdbc:odbc:Driv
er=
{MicroSoft Access Driver (*.mdb)};
DBQ=english\\english.mdb","","");
Stmt=Con.createStatement();
? ResultSetrs=Stmt.executeQuery("SELECT* FROM表1");
?boolean boo=false;
? while((boo=rs.next())==true)
?{
?? ename=rs.getString("单词");
???cname=rs.getString("解释");
??if(ename.equals(添加英语单词_文本条.getText()))
???{
???JOptionPane.showMessageDialog(this,
"此词汇已存在!","警告",
??JOptionPane.WARNING_MESSAGE);
? break;
}
?}
? if(boo==false)
??{
String s1="'"+添加英语单词_文本条.getT
ext().trim()+"'",s2="'"+添加汉语解释_文本条.getTex
t().trim()+"'";
?String temp="INSERT INTO 表1 VALUES
("+s1+","+s2+")";
Stmt.executeUpdate(temp);
???JOptionPane.showMessageDialog(this,"添加成功!","恭喜", ?JOptionPane.WARNING_MESSAGE);
??dispose();
??}
Con.close();}
2、删除功能的实现:
public void删除() throws SQLException{
Stringcname,ename;
try
{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
? } catch(ClassNotFoundException e){}
??Con = DriverManager.getConnection
("jdbc:odbc:Driver={MicroSoftAccess
Driver (*.mdb)};DBQ=english\\english.m
db","","");
Stmt=Con.createStatement();
? ResultSet rs=Stmt.executeQuery("SELECT * FROM 表1");
?boolean boo=false;
? while((boo=rs.next())==true)
{
?ename=rs.getString("单词");
???cname=rs.getString("解释");
?if(ename.equals(删除单词_文本条.getText()))
?{
String s1="'"+删除单词_文本
条.getText().trim()+"'"
String temp="DELETE FROM 表 1 WHERE单词="+s1;
Stmt.executeUpdate(temp);
JOptionPane.showMessageDialog(this,
"成功删除记录!","恭喜",
JOptionPane.WARNING_MESSAGE);
dispose();
break;
?? }
}
Con.close();
if(boo==false)
? {
JOptionPane.showMessageDialog(this,
"不存在此单词!","警告",
??JOptionPane.WARNING_MESSAGE);
?}
}
3、修改功能的实现:
?public void修改() throws SQLException{
?String cname,ename;
?try
{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
?} catch(ClassNotFoundExceptione){}
Con =DriverManager.getConnection
("jdbc:odbc:Driver={MicroSoft Access Drive
r (*.mdb)};DBQ=english\\english.mdb","","");
Stmt=Con.createStatement();
?ResultSet rs=Stmt.executeQuery("SELECT * FROM 表1");
?boolean boo=false;
?while((boo=rs.next())==true)
?{
?ename=rs.getString("单词");
??cname=rs.getString("解释");
?if(ename.equals(修改英语单词_文本条.getText())) ?{
??? Strings1="'"+修改英语单词_文本
条.getText().trim()+"'",s2="'"+修改汉语解释_
文本条.getText().trim()+"'";
?String temp="UPDATE表1 SET 解释="+s2+"
WHERE 单词="+s1;
Stmt.executeUpdate(temp);
JOptionPane.showMessageDialog(this,
"记录修改成功!","恭喜",
???JOptionPane.WARNING_MESSAGE);
? dispose();
??break;
? }
??}
??Con.close();?
??if(boo==false)
??{
???JOptionPane.showMessageDialog(this,
"不存在此单词!","警告",
??JOptionPane.WARNING_MESSAGE);
?}}
4、实现按钮监听的实现:
publicvoid actionPerformed(ActionEvente){??if(e.getSource()==b1||e.getSource()==englishtext) ?{
??chinesetext.setText("");
???if(englishtext.getText().equals(""))
?{
?JOptionPane.showMessageDialog(this,
"查询对象不能为空!","警告",
??JOptionPane.WARNING_MESSAGE);
}
else{
?? try{?Listwords();?}
? catch(SQLException ee){ }
? }
? }
??else if(e.getSource()==b2||e.getSource()==addedit)
??{ AddWin add = new AddWin(); } //AddWin是添加窗口的类
?elseif(e.getSource()==b3||e.getSource()==modedit) { ModifyWin modi =new ModifyWin();}
//ModifyWin是修改窗口的类
?else if(e.getSource()==b4||e.getSource()==deledit) { DelWindel = new DelWin();}//DelWin是删除窗口的类
??else if(e.getSource()==edic) //英汉
{
?label.setText("输入要查询的英语单词:");
??b1.setVisible(true);
?}
elseif(e.getSource()==cdic) //汉英
?{
label.setText("输入要查询的汉语意思:");
???b1.setVisible(true);
?}
?else if(e.getSource()==back_data) //备份
?{
??= new File("english\\english.mdb");
fis = null; ?
?(true);
try{
?fis = new (fromfile);
????int bytesRead;
//定义变量来存储输入流中读取出来的文件
?byte[] buf = new byte[4*1024];//4K buffer
=new
(),
());
? fos = new (tofile);
??while((bytesRead = fis.read(buf))!=-1)
{ fos.write(buf,0,bytesRead); }
?fos.flush();fos.close();fis.close();
?} catch(IOException e2){ }
??}?
else if(e.getSource()==quit) //退出
??{ System.exit(0); }
?else if(e.getSource()==about) //关于
{
??final String AboutMsg = "A Electrical Dictionary \n \n"
?+"An application written to show off the function of
dictionary.\n \n"
???+"JAVA课程设计杨汝洁\n\n"
?+"Copyright (c) 2008 by Edith.All rights Reserved.";
?JOptionPane.showMessageDialog(topFrame,AboutMsg);
?}
?else if(e.getSource()==hhelp)//帮助
??{
??HelpFrame help = new HelpFrame();
?help.setVisible(true);
?} }
5、实现查询功能的实现
public void Listwords() throws SQLException //
{
?String cname,ename;
?try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch(ClassNotFoundException e){}
?String url="jdbc:odbc:English";?//建立桥接器
Connection Ex1Con = DriverManager.getConnection ?("jdbc:odbc:Driver={MicroSoft Access Driver
(*.mdb)};DBQ=english\\english.mdb","","");
Statement Ex1Stmt= Ex1Con.createStatement();
if(label.getText().equals("输入要查询的英语单词:")) ??{
?ResultSet rs = Ex1Stmt.executeQuery("SELECT * F ROM 表1");
??while( rs.next())
?{
?ename = rs.getString("单词");
cname = rs.getString("解释");
??if(ename.equals(englishtext.getText())) ??{
??chinesetext.append(cname+'\n');
???}
?}
?Ex1Con.close(); //关闭数据库
??if(chinesetext.getText().equals(""))
?{
?JOptionPane.showMessageDialog(this,
"查无此单词!","警告",
??JOptionPane.WARNING_MESSAGE);
???}
}
else if(label.getText().equals("输入要查询的汉语意思:"))
?{
??ResultSet rs=Ex1Stmt.executeQuery("SELECT * FROM 表1
WHERE 解释 LIKE '%"+englishtext.getText()+"%'");
??while(rs.next())
?{
??ename = rs.getString("单词");
??cname = rs.getString("解释");
??chinesetext.append(ename+'\n');
??}
?Ex1Con.close(); //关闭数据库
??if(chinesetext.getText().equals(""))
?{
??JOptionPane.showMessageDialog(this,
"查无此单词!","警告",
??JOptionPane.WARNING_MESSAGE);
??}}
}
四、软件测试
经过编译、执行后可看到运行界面如图4.1所示
图4.1
此时有三全菜单选择:文件、编辑、帮助
1、文件菜单:它包含四个子菜单:英汉词典、汉英词典、备份词库及退出。打开该词典时默认进入的是英汉词典。如图4.2所示:
图4.2
(1)英汉词典:在文本框中输入要查询的英文单词,单击“查询”,英文单词对应的中文解释及其词性便会出现在文件对话框中,如图4.3所示:
图4.3
如果所查单词不存在于词库中,则会弹出“警告”,说明“查无此词”,如图4.4所示;如果是没有输入直接点击“查询”,则会弹出“警告”,说明“查询对象不能为空”,如图4.5所示:
图4.4 图4.5(2)汉英词典:在在文本框中输入要查询的汉语意思,单击“查询”,对应的英文单词便会出现在文件对话框中,如图4.6所示:
图4.6如果所查单词不存在于词库中,则会弹出“警告”,说明“查无此词”;如果是没有输入直接点击“查询”,则会弹出“警告”,说明“查询对象不能为空”,演示与英汉词典类似。
(3)点击备份词库时,会弹出保存文件对话框,此时可将词库拷贝到机算机里的任一位置。
2、编辑菜单:它包含三个子菜单:添加词汇、修改词汇和删除词汇。如图4.7所示
图4.7
(1)添加词汇:用户可自行输入所添加的单词及其解释,如图4.8所示
图4.8 图4.9
如果添加的是词库中没有的单词,系统在添加成功后有提示“添加成功”,如图4.9所示;若添加的是词库中已有的单词,系统会弹出“警告”,说明“此词汇已存在”。
(2)修改词汇:用户可自行修改词库中的单词的解释,如图4.10所示;如果输入单词不存在于词库中,系统会弹出“警告”,说明“不存在此单词”。
图4.10图4.11(3)删除词汇:用户可自行删除词库中已有的单词,在删除此单词的同时,其解释也会随之被删除,如图4.11所示。如果输入单词不存在于词库中,系统会弹出“警告”,说明“不存在此单词”。
3、帮助菜单:它包含二个子菜单:帮助和关于。
(1)帮助:显示有关于词典的功能说明。
(2)关于:显示版本信息。
经测试,该系统各项功能均能使用,各个功能选项与设计所想相符。
五、总结
此次课程设计是由我一个人完成的,在这个过程中,我遇到了很多问题,也更加了解JAVA。Java与C++语言非常相近,但Java比C++简单,它抛弃了C++中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。 Java实现了自动的垃圾收集,简化了内存管理的工作。这使程序设计更加简便,同时减少了出错的可能。
Java提供了简单的类机制和动态的构架模型。对象中封装了它的状态变量和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而既实现了代码的复用,又提供了一种动态的解决方案。
除此之外,此次课程设计还让我对JAVA的独立性有了更多的认识。
Java是一种网络语言,为使Java程序能在网络的任何地方运行,Java解释器生成与体系结构无关的字节码结构的文件格式。Java为了做到结构中立,除
生成机器无关的字节码外,还制定了完全统一的语言文本,如Java的基本数据类型不会随目标机的变化而变化,一个整型总是32位,一个长整型总是64位。
为了使Java的应用程序能不依赖于具体的系统,Java语言环境还提供了用于访问底层操作系统功能的类组成的包,当程序使用这些包时,可以确保它能运行在各种支持Java的平台上。
java.lang: 一般的语言包。其中包括用于字符串处理、多线程、异常处理和数字函数等的类,该包是实现Java程序运行平台的基本包java.util: 实用工具包。其中包括哈希表、堆栈、时间和日期等
java.io: 基于流模型的输入/输出包。该包用统一的流模型实现了各种格式的输入/输出,包括文件系统、网络和设备的输入/输出等
java.net: 网络包。该包支持TCP/IP协议,其中提供了socket、URL 和WWW的编程接口
java.awt: 抽象窗口工具集。其中实现了可以跨平台的图形用户界面组件,包括窗口、菜单、滚动条和对话框等
java.applet: 支持applet程序设计的基本包
在课程设计的最后,我的大部分时间花在了与数据库的连接上,也学到了更多的知识。
JDBC是执行SQL语句的Java API。JDBC本身是一个产品的商标名,但它也可被看作为"Java Database Connecivity(Java数据库连接)"。它由一组用Java语言编写的类与接口组成。JDBC已成为一种供工具/数据库开发者使用的标准API,用户可以用纯JavaAPI来编写数据库应用。使用JDBC可以很容易地把SQL语句传送到任何关系型数据库中。换言之,用户不必为访问Sybase数据库写一个程序,又为访问Oracle数据库写另一个程序。你可以用JDBC API写出唯一的程序,它能够将SQL语句发送到相应的任何一种数据库。Java与JDBC的结合,使程序员可以只写一次数据库应用软件后,就能在各种数据库系统上运行。
通过对JAVA数据库编程的更多的了解,我也获得了一些调试的经验:通过层层的捕获异常来得知错误的发生。在课程设计中出现的问题对我而言是学习与复习的好机会,是它们使我学会了如何自学、如何查阅资料等,让我学习了很多,
也让我对旧的知识点有了更深的理解。
在这不断的调试、改动的过程中也让我明白了养成良好编程习惯的益处。由于编写程序时容易出错,因此我采用了单个模块单个功能进行调试与测试的方法。在不断的出错与改错的过程中,我学到了很多关于编程和调试程序的知识,使自己的知识体系得到了一定的完善,也使我对平时所学有了很多的了解与更深的理解。面对一系列的问题,失败了尝试,再失败再尝试……通过这次的实践,我发现了自己在编程及对软件开发相关知识的不足,在以后的学习实践中,我要取长补短,敢想善问,不断加强自身在专业知识方面的能力,为以后的学习与工作打下坚实的基础。