• 回答数

    5

  • 浏览数

    338

魔神坛老佛爷
首页 > 毕业论文 > 基于套接字编程毕业论文

5个回答 默认排序
  • 默认排序
  • 按时间排序

我是五叶神

已采纳

一切一切…网上搜搜…给我分吧…回答者: 不知道吧哈哈哈 - 高级魔法师 七级 5-11 08:53这个不知道吧哈哈哈就是垃圾厚脸皮跟人家要分

337 评论

饕餮飨宴

TAGS: 毕业论文 计算机 基于 远程 对象 RMI 方法 实现 调用 哪位老兄有计算机毕业设计论文啊?是基于java的,小弟急用,谢谢!用RMI开发基于Java的企业分布式应用我站还提供更多的免费计算机论文,但免费论文仅供参考,建议广大网友下载后不要轻易采用。摘要由于Java具有跨平台、代码可移植性、安全高效等广泛而强大的功能,因而在开发网络分布式应用的时候,可以用它自身的机制实现分布式计算,一种基于Java的远程方法调用(RMI)为我们开发企业分布式应用提供了行之有效的解决方案。关键词 Java RMI 企业分布式应用 1 概述随着电力企业信息化建设的不断深入和发展,企业内部和企业与企业之间对信息、对数据的交换量大大增加,这些信息与数据越来越需要在不同的计算机网络间传送和交流。同时,由于各单位、各部门之间的现存的计算机网络硬件设备与操作系统千差万别,应用水平也参差不齐,因此,开发出跨平台、可移植、高效安全的网络分布式应用来服务于电力企业,就显得尤为重要。在当今的编程术语里,分布式计算已经成为很常见的词,它将企业的业务数据和程序分布在网络的不同物理位置上,通过调动网络上多台计算机的处理能力,发挥远程调用数据的功能。远程方法调用(Remote Method Invocation ,RMI),可以在不同的Java虚拟机(JVM)之间实现对象与对象的通信。JVM可以位于相同或不同计算机上,在多个JVM中,一个JVM可以调用存储在其它JVM的对象的方法。本文主要介绍RMI的特点,分析应用RMI进行企业分布式计算的原理,以及利用RMI实现基于Java的企业分布式应用的具体步骤。2 远程方法调用(RMI)的特点 TCP编程的缺点由于Java编程语言设计之初就是面向对象和支持网络的,因此,基于对象的RMI机制已经内置在Java平台中。我们经常会在网络开发中使用TCP/IP编程,这样,自然而然地就会涉及到Socket(套接字)编程。但是,使用Socket编程需要大量重复编码,在复杂分布式操作时显得非常麻烦,而且易于出错。因此,如何快速、高效、安全、可扩展地进行网络分布式计算,是开发者们一贯追求和倡导的主题。直到RMI的出现,这种繁杂、低效的开发情况才有很大改观。 RMI编程的特点当我们利用对象序列化在网络上分配对象时,RMI提供了非Java平台无法匹敌的独特而强电子商务资料库)*!%267'$#7'455大的分布式计算模型,RMI主要有以下特点:? 客户机可以向本地方法一样调用远程服务器上的方法;? 可以根据接口指定客户机/服务器编程合约;? 可以从服务器对象缺省二进制类文件,自动生成调动/反调动代码;? 将Java编程模型扩展到机器边界(和Java虚拟机(JVM)边界之外),不需要任何特殊语法;? 还可以和一个远程方法调用中的数据同时传输行为(代码)。尽管RMI不是唯一的企业级远程对象访问方案,但它却是最容易实现的。 RMI与CORBA作为分布式应用程序框架的规范,COBRA首当其冲,它是由对象管理组织(OMG)开发的。与CORBA不同的是,CORBA能够利用不同编程语言(例如C/C++、Basic等)开发实现分布式应用,而RMI是一种纯Java解决方案。在RMI中,程序的所有部分都由Java语言编写,这样,开发出来的程序完全符合Java规范,便于实现跨平台访问、扩展和移植。按照笔者所在西北电力建设集团公司的情况看,服务器操作系统主要有Linux和Windows2000 Server,分别存在于公司和部门当中,它们是不同的系统平台;同时,公司下属各个工程项目部又距离很远,近的几十公里,远则达到上千公里甚至位于国外,因此跨平台和远程访问这两大功能在开发企业应用系统时就必须考虑,而RMI恰恰能够用它的自身特点来满足编程需要。3 RMI基本体系结构简介RMI通过TCP/IP在内部使用Socket,象其名称暗示的那样,它能够帮助我们查找并执行远程对象的方法。RMI的目的是让位于不同JVM中的对象,在外观及行为上都像是本地的对象。通常,我们把调用这种远程对象的JVM,称为客户机;而把包括这种远程对象的JVM,称为服务器。尽管对一个远程对象的引用和获得对本地对象的引用有所不同,但我们可以把远程对象像本地对象一样使用。应用程序并不知道一个对象是远程的还是本地的。实际上,远程对象上被调用的方法与本地对象上调用的方法,具有相同的语法结构。作为RMI的底层(会包含复杂的Socket操作),它会自动截获方法调用,找到远程对象,然后处理远程请求。笔者认为,RMI设计的重要之处,就在于不但在设计上实现了远程访问功能,而且实现了设计的透明性。RMI的基本体系结构,概括起来说,由三个抽象层组成: 存根/框架层(Stubs/Skeletons Layer)

164 评论

兰生幽荣

“对图中的那些函数,我这里稍加解释一下。”

int  WSAStartup(WORD wVersionRequested, LPWSADATA  lpWSAData);

功能是初始化Windows Socket Dll,在Windows下必须使用它。

参数:

“wVersionRequested”表示版本,可以是、等;

“lpWSAData”指向WSADATA数据结构的指针。

int socket(int family, int type, int protocol);

功能是建立Socket,返回以后会用到的Socket值。如果错误,返回-1。

参数:

“int family”参数指定所要使用的通信协议,取以下几个值:AF_UNIX(Unix内部协议)、AF_INET(Internet协议)、AF_NS Xerox(NS协议)、AF_IMPLINK(IMP连接层),在Windows下只能把“AF”设为“AF_INET”;

“int type”参数指定套接字的类型,取以下几个值:SOCK_STREAM(流套接字)、SOCK_DGRAM (数据报套接字)、SOCK_RAW(未加工套接字)、SOCK_SEQPACKET(顺序包套接字);

“int protocol”参数通常设置为0。

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

功能是把套接字和机器上一定的端口关联起来。

参数:

“sockfd”是调用socket()返回的套接字值;

“my_addr”是指向数据结构struct sockaddr的指针,它保存你的地址,即端口和IP地址信息;

“addrlen”设置为sizeof(struct sockaddr)。

int listen(int sockfd, int backlog);

功能是服务端监听一个端口,直到accept()。在发生错误时返回-1。

参数:

“sockfd”是调用socket()返回的套接字值;

“backlog”是允许的连接数目。大多数系统的允许数目是20,也可以设置为5到10。

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

功能是客户端连接服务端监听的端口。

参数:

“sockfd”是调用socket()返回的套接字值;

“serv_addr”保存着目的地端口和IP 地址的数据结构struct sockaddr;

“addrlen”设置为sizeof(struct sockaddr)。

int accept(int sockfd, void *addr, int *addrlen);

功能是服务端接受客户端的连接请求,并返回一个新的套接字,以后服务端的数据传输就使用这个新的套接字。如果有错误,返回-1。

参数:

“sockfd”是和listen()中一样的套接字值;

“addr”是个指向局部的数据结构sockaddr_in的指针;

“addrlen”设置为sizeof(struct sockaddr_in)。

int send(int sockfd, const void *msg, int len, int flags);

int recv(int sockfd, void *buf, int len, unsigned int flags);

功能是用于流式套接字或数据报套接字的通讯,我们数据的真正传输就由它们完成。

参数:

“sockfd”是发/收数据的套接字值;

“msg”指向你想发送的数据的指针;

“buf”是指向接收数据存放的地址;

“len”是数据的长度;

“flags”设置为 0。

int sendto(int sockfd, const void *msg, int len, unsigned int flags,const struct sockaddr *to, int tolen);

int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);

功能和send、recv类似,不过是用于无连接数据报套接字的传输。

int closesocket(int sockfd)

功能是关闭套接字。

参数“sockfd”为要关闭的套接字值。

程序:

“这里的目的是让大家对Socket编程有个整体了解。不用怕,程序我会详细解释的,首先是服务端的程序。其流程是:

socket()→bind()→listen→accept()→recv()/send()→closesocket()

具体代码如下:”

#include <>

#include <>

#pragma comment(lib,"Ws2_32")

#define MYPORT 830  /*定义用户连接端口*/

#define BACKLOG 10  /*多少等待连接控制*/

int main()

{

int sockfd, new_fd;                                  /*定义套接字*/

struct sockaddr_in my_addr;          /*本地地址信息 */

struct sockaddr_in their_addr;        /*连接者地址信息*/

int sin_size;

WSADATA ws;

WSAStartup(MAKEWORD(2,2),&ws);           //初始化Windows Socket Dll

//建立socket

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

{

//如果建立socket失败,退出程序

printf("socket error\n");

exit(1);

}

//bind本机的MYPORT端口

 = AF_INET;                     /* 协议类型是INET  */

 = htons(MYPORT);            /* 绑定MYPORT端口*/

 = INADDR_ANY;   /* 本机IP*/

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1)

{

//bind失败,退出程序

printf("bind error\n");

closesocket(sockfd);

exit(1);

}

//listen,监听端口

if (listen(sockfd, BACKLOG) == -1)

{

//listen失败,退出程序

printf("listen error\n");

closesocket(sockfd);

exit(1);

}

printf("listen...");

//等待客户端连接

sin_size = sizeof(struct sockaddr_in);

if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)

{

printf("accept error\n");

closesocket(sockfd);

exit(1);

}

printf("\naccept!\n");

//有连接,发送ww0830字符串过去

if (send(new_fd, "ww0830\n", 14, 0) == -1)

{

printf("send error");

closesocket(sockfd);

closesocket(new_fd);

exit(1);

}

printf("send ok!\n");

//成功,关闭套接字

closesocket(sockfd);

closesocket(new_fd);

return 0;

}

对服务端程序的流程概括:

先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),&ws);

然后建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0)

再bind本机的MYPORT端口:

 = AF_INET;         /* 协议类型是INET   */

 = htons(MYPORT);       /* 绑定MYPORT端口  */

 = INADDR_ANY;   /* 本机IP           */

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))

接下来监听端口: listen(sockfd, BACKLOG)

如果有客户端的连接请求,接收它: new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)

最后发送ww0830字符串过去: send(new_fd, "ww0830\n", 14, 0)

收尾工作,关闭socket: closesocket(sockfd);    closesocket(new_fd);  ”

编译、执行,就会一直监听830端口

客户端程序了。其流程是:

socket()→connect()→send()/recv()→closesocket()

比服务端更简单吧!其实现代码如下:”

#include <>

#include <>

#include <>

#pragma comment(lib,"Ws2_32")

#define PORT 830                            /* 客户机连接远程主机的端口 */

#define MAXDATASIZE 100                     /* 每次可以接收的最大字节 */

int main(int argc, char *argv[])

{

int sockfd, numbytes;

char buf[MAXDATASIZE];

struct sockaddr_in their_addr;        /* 对方的地址端口信息 */

if (argc != 2)

{

//需要有服务端ip参数

fprintf(stderr,"usage: client hostname\n");

exit(1);

}

WSADATA ws;

WSAStartup(MAKEWORD(2,2),&ws);         //初始化Windows Socket Dll

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

{

//如果建立socket失败,退出程序

printf("socket error\n");

exit(1);

}

//连接对方

 = AF_INET;                         /* 协议类型是INET  */

 = htons(PORT);                       /* 连接对方PORT端口 */

 = inet_addr(argv[1]);        /* 连接对方的IP */

if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)

{

//如果连接失败,退出程序

printf("connet error\n");

closesocket(sockfd);

exit(1);

}

//接收数据,并打印出来

if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)

{

//接收数据失败,退出程序

printf("recv error\n");

closesocket(sockfd);

exit(1);

}

buf[numbytes] = '\0';

printf("Received: %s",buf);

closesocket(sockfd);

return 0;

}

对客户端程序的流程概括:

首先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),&ws);

然后建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0)

接着连接服务器方:

 = AF_INET;                                 /* 协议类型是INET    */

 = htons(PORT);                           /* 连接对方PORT端口      */

 = inet_addr(argv[1]);         /* 连接对方的IP  */

connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr))

连接成功就接收数据: recv(sockfd, buf, MAXDATASIZE, 0)

最后把收到的数据打印出来并关闭套接字:

printf("Received: %s",buf);      closesocket(sockfd);

编译结束后,运行服务端,然后。客户端 服务端IP  回车

你会看到服务端发来得数据。

那么基本的点对点通信就没问题了。只要两台机器同时包含服务端和客户端,就可以互相通信了。

当然,你也可以将服务端和客户端分开做,专门一个服务器负责用户登录和转发消息。

流程如下:

A客户端发登录消息-----》服务器

服务器验证发送用户消息----》客户端

A客户端想发消息给B客户端----》先发给服务端

服务器得到消息查询B客户端IP并转发消息。(或者B客户端循环发消息询问服务器有无消息)

通信结束。

137 评论

大漠金鹰

Operation attempted on invalid socket:尝试在无效的socket上操作。 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,叫连接套接字。可能原因:网络没有连接,网络不稳。 // 基于TCP套接字编程 // 函数说明 // WSAStartup() WORD wVersionRequested; WSADATA wsData; int nErrCode; wVersionRequested = MAKEWORD(2,2); nErrCode = WSAStartup(wVersionRequested, &wsData); if (nErrCode != 0) { //没有找到可用的DLL return EXIT_FAILURE; } // 检查返回的DLL是否为 if (LOBYTE() != 2 || HIBYTE() != 2) { //没有找到可用的DLL WSACleanup(); return EXIT_FAILURE; } // socket()函数 SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == s) { //失败 return EXIT_FAILURE; } // bind()函数 sockaddr_in serAddr; int nServPort = 5500; // 定义服务器地址 = AF_INET; = htonl(INADDR_ANY); = htons(nServPort); // 绑定套接字 nErrCode = bind(s, (sockaddr*) &serAddr, sizeof(serAddr)); if (SOCKET_ERROR == nErrCode) { //绑定套接字失败 return EXIT_FAILURE; } // listen()函数 nErrCode = listen(s, 10); if (SOCKET_ERROR == nErrCode) { //监听套接字失败 return EXIT_FAILURE; } SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);如果没有对这句创建socket失败进行判断而直接对s进行操作,会导致你说的情况。还有一种情况就是一切都正常,但是连接断开了,如果未进行处理,而对s进行操作,也会报错。

270 评论

yanjinshujie

目 录一、概要设计……………………………………………………………3二、程序整体设计说明…………………………………………….…..4三、程序部分源代码及注释…………………………………………….9四、测试结果………………………………………………………….24五、设计心得…………………………………………………………25六、致 谢…………………………………………………………25七、参考文献…………………………………………………………25【摘 要】该程序是一个图形界面的java文档编辑器,其界面主要采用了awt包, 程序实现了文本编辑器的基本功能有:新建文件、打开文件、文件保存、文件另存为、剪切、复制、粘贴、删除、查找/替换、改变字体大小,另外还利用Time类的schedule方法实现了文件的定时自动更新功能,并创建备份文件,由于该编辑器是用的awt包,所以在技术上没有实现将Java的关键字以不同颜色显示功能。【关键字】java 编辑器一、概要设计Java程序编辑器是:图形界面、线程、流与文件等技术的综合应用。图形界面的实现:考虑到简单、实用、高效等特点,就选择了AWT来完成实现,在选择组件上,文本编辑区就选用了TaxtArea作为主要的部件。线程实现文件自动保存:在相关的参考书上查阅到在Time类中有一个schedule方法可以在后台自动完成一定的功能,而且调用起来相当简单,于是就用了Time类中的schedule方法来实现文件自动保存及备份功能。文件操作的实现:利用了字符文件流FileReader和FileWriter类来实现。由于Java的特性,可能用任何一个编辑器来编辑,于是就将Windows中的记事本作为模仿对象,根据实现情况删减了其中的一些功能,如自动换行,设置字体,打印等功能。在设计类的时候,考虑到简单明了,就用了两个类,一个主类和一个默认属性类作为程序的整体框架,所有的对象和方法都是在默认属性类中创建和实现的,以及为各组件注册事件监听程序也是在默认属性类中实现的。主类完成对象的实例化及显示。这们设计的优点是:条理清晰,容易理解,容易修改。这样设计的缺点是:不利于共享类中的方法。二、程序整体设计说明、程序框架图、程序中所用类说明(1)用户自定义类类名:EditInstantiation作用:实例化对象继承的父类:WindowAdapter主要成员变量:Frame myFrm // 定义主窗体TextArea myText // 定义文本编辑区Dialog myDlgFind,myDlgFindont //查找及设置字体对话框TextField TFfind, TFreplace, TffontSize//查找对话框和字体窗体中的文本行Button BfontOK, Bfind, Breplace, Bnext, Bcancel //定义和创建各按钮Label Lf, Lr, Ls //定义和创建各标签MenuBar Mbbar //定义和创建主菜单Menu Mfile,Medit,Mformation,Mhelp //定义和创建主菜单中的选项Toolkit toolKitClipboard myCB //剪切板对象FileDialog myFDlg //定义文件对话框Choice ChfontName //定义和创建字体选择框private int VIindex = 1; //构成文件名后缀变量private String VSsubFixStr=".java"; //构成文件名扩展名变量private String VSmyFileName = "Document1",VSmyBFileName;//文件名及备份文件名变量private File VFmyFile=new File(VSmyFileName+VIindex+".java");//文件名变量private int VIsearchPosition=0; //查找位置指针private Timer VTtime; //实例化一个Time类private int VImin=1; // schedule方法中的一个时间参数private int VItype=;//提示对话框类型private String VStitle; //提示对话框标题private String VSmessage; //提示对话框信息private boolean VBchanged = true; //改变字体的一个标识private int VIfontSizeMin = 8, VIfontSizeMax = 40, VIfontSizeChangedStep = 2; //设置字体大小及步长主要成员方法:public void init() //初始化各部件菜单的定义和事件的监听public void displayEdit ()//显示窗体及调用Time中的schedule方法public void windowClosing () //关闭窗体public void save //保存文件方法a.内部类类名:KeyEvents作用:实现菜单的事件的响应功能继承的父类:KeyAdapter主要成员变量:无成员方法:actionPerformed()、keyPressed()b.内部类类名:FindKeyEvent作用:实现查找中各部件事件的响应功能继承的父类:无主要成员变量:无成员方法:actionPerformed ()c.内部类类名:fontEvent作用:实现字体中各部件事件的响应功能继承的父类:无主要成员变量:无成员方法:ItemListener(),ActionListener()(2)用户自定义类与Java类的继承关系图如下:自定义类 Java 类线程使用说明、实现接口方法本程序用到的方法有:schedule其方法描述如下:schedule(事件,启动时间,间隔时间);、线程应用本程序为文本编辑器,为实现自动更新,应用到了线程,每隔1分钟对文件进行自动更新、异常处理说明(1)打开文件时的异常处理需要处理的异常:IOException处理方法:捕获异常后,显示捕获的异常(2)保存文件时的异常处理需要处理的异常:IOException处理方法:捕获异常后,显示捕获的异常、程序运行效果及存在的问题(1)程序运行主要界面如下:a、主界面b、打开文件对话框c、保存文件对话框d、另存为文件对话框e、查找/替换对话框f.字体对话框.程序尚还存在的问题我花费了近一个多星期的时间,查阅了许多相关的资料,终于把这个Java编辑器,程序基本实现了该课程设计的基本要求。但由于自己水平有限,使得程序还有不是很完善,首先,最重要的一点是该设计的最重要的功能自动改变java关键字的颜色没有实现。三、程序部分源代码及注释//****************************************************// class name :Edit// implements :none// extends :none// attribute :public// founction :entrance of the class//*****************************************************public class Edit{ //主类public static void main(String args[]){EditInstantiation myEdit= new EditInstantiation();(); //初始化(); //显示窗体}//****************************************************// class name :EditInstantiation// implements :none// extends :WindowAdapter// attribute :default// founction :EditInstantiation of the main class//*****************************************************class EditInstantiation extends WindowAdapter{ //默认属性类//define sources 定义各部件Frame myFrm=new Frame("我的编辑器"); //定义窗体TextArea myText=new TextArea(); //定义窗体Dialog myDlgFind=new Dialog(myFrm,"查找",true); //定义查找对话框Dialog myDlgFindont=new Dialog(myFrm,"字体",true); //定义字体对话框TextField TFfind=new TextField(30);//定义查找对话中的查找输入框TextField TFreplace=new TextField(30); //定义查找对话中的替换输入框TextField TFfontSize,TFfontDemo;//定义字体大小文本框和示例框Choice CHfontName;//定义字体大小选择框List LTfontSize; //定义字体大小标签Button BfontOK,BfontCancel; //定义字体大小对话中的确定及取消按钮Button Bfind=new Button("查找");//定义查找对话中的查找按钮Button Breplace=new Button("替换");//定义查找对话中的替换及取消按钮Button Bnext=new Button("下一个");//定义查找对话中的下一个及取消按钮Button Bcancel=new Button("取消");//定义查找对话中的确定及取消按钮Label Lf=new Label("查找内容:");Label Lr=new Label("替换为: ");Label Ls=new Label("字体大小:");FileDialog myFDlg;Clipboard myCB=().getSystemClipboard(); //剪切板对象Menu Mfile,Medit,Mformation,Mhelp;MenuBar MBbar;//define varities //定义各变量private int VIindex = 1;private String VSsubFixStr=".java";private String VSmyFileName = "Document1",VSmyBFileName;private File VFmyFile=new File(VSmyFileName+VIindex+".java");private int VIsearchPosition=0;private Timer VTtime;private int VImin=1; // parameter in time schedulprivate int VItype=;private String VStitle;private String VSmessage;// flag of the changeingprivate boolean VBchanged = true;// the scope of the fontprivate int VIfontSizeMin = 8, VIfontSizeMax = 40, VIfontSizeChangedStep = 2;//************************************************//founction name:init()//parameter :none//attribute :public//founction :initia all compont//************************************************public void init(){ //初始化各部件//------------------ set menu ------------------MBbar=new MenuBar();(MBbar);Mfile=new Menu("文件");Medit=new Menu("编辑");Mformation=new Menu("格式");Mhelp=new Menu("帮助");(Mfile);(Medit);(Mformation);(Mhelp);//文件菜单 add File (new MenuItem("新建",new MenuShortcut()));(new MenuItem("打开",new MenuShortcut()));(new MenuItem("保存",new MenuShortcut()));(new MenuItem("另存为"));();//分隔线(new MenuItem("退出",new MenuShortcut()));//编辑菜单 add Edit (new MenuItem("剪切"));//,new MenuShortcut()));(new MenuItem("复制"));//new MenuShortcut()));(new MenuItem("粘贴"));//new MenuShortcut()));(new MenuItem("删除"));//new MenuShortcut()));();//分隔线(new MenuItem("查找/替换",new MenuShortcut()));();//分隔线(new MenuItem("全选",new MenuShortcut()));//格式菜单 add Formation (new MenuItem("字体",new MenuShortcut()));//帮助菜单 add Formation (new MenuItem("关于作者"));//----------------- menu add end -------------------------//add Menu Action (new KeyEvents());(new KeyEvents());(new KeyEvents());(new FindKeyEvent());//--------------------------- Find (350,115);(250,150);(new FlowLayout());();(false);(false);(false);(Lf);(TFfind);(Lr);(TFreplace);(Bfind);(Breplace);(Bnext);(Bcancel);(new WindowAdapter(){public void windowClosing(WindowEvent e){(false);}});//为查找对话框窗体注册事件监听(new KeyEvents());//注册事件监听(new FindKeyEvent());(new FindKeyEvent());(new FindKeyEvent());(new FindKeyEvent());//--------------- end add action listener ------------//================set font dialog ==============//font size text fieldTFfontSize = new TextField("8",14);();//font size list fieldLTfontSize = new (5, false);(new fontEvent());for(int i = VIfontSizeMin; i <= VIfontSizeMax; i = i + VIfontSizeChangedStep)(i + "");//添加字体大小(0);//two Button Ok CancelBfontOK = new Button("确定");(new fontEvent());BfontCancel = new Button("取消");(new fontEvent());//a TextField for demo the fontTFfontDemo = new TextField("Java awt",37);(false);// my font dialog设置字体对话框(new FlowLayout());();(Ls);(TFfontSize);(BfontOK);(BfontCancel);(LTfontSize);(TFfontDemo);(300,200);(300,200);(false);(new WindowAdapter() {public void windowClosing(WindowEvent e) {(false);}}); //为字体对话框窗体注册事件监听//=============end set font dialog// =======set Edit frame设置编辑器窗休(myText,);(500,400);();(this);(500,400);(200,100);("Java编辑器");}//************************************************//founction name:displayEdit()//parameter :none//attribute :public//founction :initial and display the frame//************************************************public void displayEdit(){ //显示窗体(true);//---------------------- auto save ---------------------VTtime = new Timer(true);(new (){public void run(){if(VSmyFileName!=null){save(VSmyFileName+".java");VSmyBFileName=VSmyFileName+".bak";} //添加自动保存功能save(VSmyBFileName);}}, VImin*60*1000,VImin*60*1000);//parament 1 the task//parament 2 when to start the task//parament 3 set the interval time }//****************************************************// class name :KeyEvents// implements :ActionListener// extends :KeyAdapter// attribute :default// founction :implement the mouse and key action//*****************************************************class KeyEvents extends KeyAdapter implements ActionListener{//********************************************************//founction name:actionPerformed()//parameter :none//attribute :public//return :void//founction :realize the key action in the menu//*********************************************************public void actionPerformed(ActionEvent e){//完成菜单事件的功能// File Menuif (()=="新建"){//remind youJFrame aFrame=new JFrame();();JOptionPane optionPane=new JOptionPane();String choices[]={"是","否","取消"};int n=(aFrame,"文件正文已更改,是否保存更改","文本编辑器",[0]);//保存文件后新建if(n==0){//若文件存在,保存在原文件中,再新建文件try{if(()){save(VSmyFileName); // call the save ("");VIindex++;}else{//若文件不存在,则保存后再新建myFDlg=new FileDialog(myFrm,"保存文件",);(VSmyFileName);();VSmyFileName=()+();save(VSmyFileName);("");VIindex++;}}catch(Exception ne){}}//不保存文件新建if(n==1){("");VIindex++;}//取消新建if(n==0){return;}}//打开菜单 Open Menuif (()=="打开") {myFDlg=new FileDialog(myFrm,"打开",);();if (()!="") {VFmyFile=new File(()+());VSmyFileName=()+();if( ()){try{FileReader fr=new FileReader(VFmyFile);BufferedReader br=new BufferedReader(fr);String text;("");while ((text=())!=null)(text+"\r\n");();();}catch(IOException ioe){VStitle="提示";VSmessage="打开文件出错";(myFrm,VSmessage,VStitle,VItype);}}}}//保存菜单 Save Menuif (()=="保存"){myFDlg=new FileDialog(myFrm,"保存文件",);(VSmyFileName);();VSmyFileName=();if(VSmyFileName!=null){VSmyFileName=()+();save(VSmyFileName);}}//另存为菜单 SaveAs Menuif (()=="另存为"){myFDlg=new FileDialog(myFrm,"文件另存为",1);(VSmyFileName);();VSmyFileName=();if(VSmyFileName!=null){VSmyFileName=()+();save(VSmyFileName);}}//退出菜单 exit Menuif (()=="退出")(0);//编辑 Edit Menuif (()=="剪切"){//CutString text =();StringSelection selection = new StringSelection(text);(selection, null);("",(),());}if (()=="复制"){//copyString text=();if(text!=null){StringSelection selection=new StringSelect

267 评论

相关问答

  • 基于web程序设计毕业论文题目

    我懂怎么安排,你选我

    凉风正正 5人参与回答 2023-12-09
  • 基于plc的毕业论文题目5000字

    PLC毕业设计毕业论文

    shally9073 7人参与回答 2023-12-11
  • 通信工程毕业论文基于智能

    噶声音大嘎哈是按时打算打算的撒打算打算大飒飒

    hocc豆叮 3人参与回答 2023-12-10
  • 基于数字识别的毕业论文

    数据通信作为当今最具潜力的电信新业务,在近几年得到了快速的发展,呈现了旺盛的生命力和巨大的市场潜力。下面是我为大家整理的数据通信 毕业 论文 范文 ,供

    正在缓冲1234 4人参与回答 2023-12-06
  • 毕业论文可以直接套模板吗

    当然可以用啊,最好选择一个与论文有点相关性的图片背景什么的,不需要太花哨;与别人雷同也没有什么影响,只要内容不雷同就OK,答辩时老师关注的不是ppt模板,而是p

    奈奈小妖精 3人参与回答 2023-12-11