1、面向 Internet 上的 CSCW 的共享白板的设计与实现摘 要随着 Internet 的迅速普及,计算机技术进入了以网络为中心的时代。在计算机网络的支持下。地理上分布的人们需要协同工作。因此计算机支持协同工作(CSCW)应运而生。人们希望借助协同工作环境以“你见即我见”的方式进行交互。而电子白板作为计算机支持协同工作(CSCW)中的一个重要的图形交互工具,使处于不同地点的用户通过计算机可以实时的进行图形交互,用户简单快速地实现协同工作,业务处理过程,迅速适应市场的变化,从而获得更好的经济效益。本系统将 CSCW 与 Java 技术相结合,采用 Java 语言中的 Socket 网络编程技
2、术,实现了客户端与服务器端之间网络底层的链接和信息的交换,用 C/S 计算机模型设计并实现了一个基于 Java 的电子白板系统,增加网上绘制图功能,弥补了纯文本非实时交流的不足,简化了网络中的技术细节,方便可行。关键词:共享电子白板;CSCW;Java;Socket;Client/Server(C/S)The Design and Implementation of Internet Oriented CSCW Shared Whiteboard AbstractAlong with rapid popularity of Internet, computer techniques come
3、into Network Centric Computing epoch. People who are in geographically distributed locations need to collaborate with each other, so the Computer Supported Cooperative Work (CSCW) springs up. People hope interacting with each other using the WYSIWIS(What You See Is What I See) mode in CSCW environme
4、nt. The shared whiteboard is the most important tool of graphic interaction in CSCW, which helps people locating different areas to interact each other with graphics by computers. The customers carry out a work, deal with the process of business and adapt a series of variety of the market in a brief
5、 and quick way .Then a better and economic performance is acquired.This system combines CSCW with Java technology and carries out the links of the low layer of the networks and switch of the information among the clients and severs using the socket programming technology with java. The design and im
6、plementation of the shared whiteboard system based on java adopting the C/S module of computer increases the online drawing function, makes up the shortage of pure text of the no real time and predigests the details of technology in network. So the system is very useful for us.Key words: share white
7、board; CSCW; Java; Socket; Client/Server(C/S)目 录论文总页数:26 页1 引言 .12 开发技术与相关控件 .12.1 Internet 简介 12.2 计算机支持协同工作(CSCW)概述 .12.3 TCP/IP、端口和套接字的概况 .23 共享电子白板的系统功能结构 .23.1 共享电子白板的主要功能 .23.2 共享电子白板的系统结构 .34 共享电子白板的结构与设计流程 .34.1 共享电子白板的系统结构 .34.2 共享电子白板信息流设计 .44.2.1 由客户端向服务器端传递的主要消息 .54.2.2 由服务器端向客户端传递的主要消息
8、.64.3 共享电子白板的设计流程 .74.3.1 服务器端程序设计流程 .74.3.2 客户端程序设计流程 .75 共享电子白板的实现 .85.1 实现共享电子白板的语言和环境 .85.2 服务器端的实现及相关类和方法 .95.2.1 服务器的实现 .95.2.2 服务器实现的相关类和方法 .115.3 客户端的实现及相关类和方法 .155.3.1 客户端实现 .155.3.2 客户端实现的相关类和方法 .17结 论 .24参考文献 .24致 谢 .25声 明 .26第 1 页 共 26 页1 引言随着 Internet 的迅速发展,在 Email、WWW、FTP 等传统的非实时应用日趋成熟
9、的同时,广大网络用户对在线实时交流的需求不断扩大,如网上会议、远程教学、协同工作等。这方面的应用软件也日益丰富起来。该类软件主要分为两类,一种是以目前和主页上的聊天室为代表的纯文字型的交流工具;另一种就是本文要介绍的电子白板类交流工具。电子白板除了具备聊天室的全部功能外,更重要的是,它还引入了绘画图形交流功能,使网上交流的形象性和直观性大大加强了,弥补了文字交流的不足。当分布在 Internet 不同位置的用户用白板进行交流时,一个人在自己的白板上绘制的图形可以马上在别人的白板上显示出来,好象大家都在同一块白板上绘画,彼此间的距离感大大缩短了。电子白板技术最初是指多媒体视频会议系统中,与会者通
10、过某个界面实时共享数据并协作的技术。任何与会者在电子白板上的操作,包括简单的图形绘制操作,文字输入操作等,都可以实时地与其他会者共享。更复杂的白板要支持窗口共享以及本地多媒体的链接与嵌入,并且可以将每一个图形实体作为对象保存到文件中。随着 WWW 的发展以及 Browser/Server 计算模式的日益流行,Client/Server 计算模式也在发展,本人做的面向 Internet 上的 CSCW 的共享白板的设计与实现是用 Client/Server 计算模式做的。电子白板技术已经不仅仅局限于应用在多媒体视频会议系统中了。2 开发技术与相关控件2.1 Internet 简介Internet
11、 是在 ARPAnet(高级研究计划署网络)的基础上发展起来的。ARPAnet 始建于 20 世纪 60 年代末期,如今 Internet 已经深入到人们生活的各个方面,并带来了全新的通信方式,是人类通信方式的又一次革命。Internet 的飞速发展和广泛应用为人们的信息交流、传输带来了极大的便利。目前用户可以看到的 Internet 提供的服务有很多,主要有 WWW 服务、文件传输服务(FTP)、电子邮件服务(E-mail)和远程登录服务(Telnet)等。这些都是当今世上最流行的服务,也是人们经常要用到的服务。2.2 计算机支持协同工作(CSCW)概述通信技术、计算机技术以及网络技术的融合
12、,产生的新的研究领域计算机支持的协同工作(Computer Supported Cooperative Work,CSCW),简称计算机协同工作。1984 年由美国 MIt 的 IreneGreif 和 DEC 的 PaulCashman 提出的。第 2 页 共 26 页CSCW 是地域分散的一个群体,借助计算机及网络技术,共同协调与协作来完成一项任务。它包括群体工作方式研究和支持群体工作的相关技术研究、应用系统的开发等部分。通过建立协同工作的环境,改善人们进行信息交流的方式,消除或减少人们在时间和空间上的相互分隔的障碍,从而节省工作人员的时间和精力,提高群体工作质量和效率。CSCW 是在计算
13、机支持的环境下(CS),特别是在网络环境下,一个群体协同完成一项共同的任务(CW),它的目标是设计出支持各样协同工作的工具、环境与应用系统。CSCW 是研究群体如何工作,探讨各种技术特别是计算机技术如何支持群体工作的一个新的研究领域。CSCW 的研究涉及到计算机网络、多媒体、人工智能、面向对象技术、数据库、并行与分布式处理、自然语言处理以及认知科学、行为科学、艺术等诸多领域。CSCW 研究的焦点应始终集中于人-人交互以及其中知识的表示与沟通。以面向对象为其基本方法论,以高速计算机网络为基础,以开放的分布式系统为支撑环境。2.3 TCP/IP、端口和套接字的概况TCP/IP(Transactio
14、n Control Protocol ,传输控制协议)实际上是一组协议的集合。当应用程序要求传输协议能提供可靠的数据传输时,可使用 TCP协议,因为在 TCP 协议中验证数据在网络上是否以合适的序列正确地传输。TCP是一种可靠的、面向连接的协议。TCP 提供的可靠性是利用一种被称为“重传肯定确认(Positive Acknowledgment with Retransmission ,PAR)”机制来实现的。端口(Port)是基本的连接单元。端口的作用是非常重要的,在使用TCP/IP 协议在主机上建立服务之前,用户必须首先抒写监听的端口,指定端口号以表示其上运行的是何种服务。如果用户希望与主机
15、通信并完成某种服务,必须抒写端口号。套接字(Socket)是一个 IP 地址和一个端口号的组合,一个套接字可以惟一地标识整个 Internet 中的一个网络进程。套接字和端口号作为术语有时是可以互相转换的,实际上,知名服务经常称为知名套接字。在本实验中,套接字是指 IP 地址和端口号的组合。一对套接字(一个用于接收主机,另一个用于发送主机)可以定义面向连接协议的一次连接。3 共享电子白板的系统功能结构3.1 共享电子白板的主要功能本软件共享电子白板的功能主要有以下几点:1)支持多用户对图形、文本等的绘制操作功能,如直线、圆、椭圆、填充圆、文本等。第 3 页 共 26 页2)支持多用户对同一内容
16、进行讨论功能。有纯文字的讨论显示内容区和图形、文本讨论显示内容区。3)支持用户自觉锁的功能。如果用户不是主讲者,也就是对图形、文本显示内容区的绘制者,就要自觉地锁定对图形、文本显示内容区的操作功能,只能对纯文字显示内容区内发表个人的意见。3.2 共享电子白板的系统结构电子白板由服务器端和客户端两部分组成,服务器端监听客户对某个特定端口的网络连接请求,并与之建立连接,这样,这个客户的数据就可以发送到服务器,再由服务器转发给其他客户。客户端的任务是将用户的输入数据发送给服务器,同时接收服务器转发的别的用户的输入数据。也就是说,每个客户端只与服务器进行通信,并不直接与其他客户建立连接。这个设计方案与
17、另一方案,即在客户端之间直接建立网络连接相比较,其优点是客户端不需要管理和维护其他客户的信息,系统结构更清晰明了,系统效率也更高。客户端运行时将立即向服务器的某个端口发送连接请求,待连接建立后则由用户的发送线程发送该用户的输入数据到服务器。服务器端的主线程负责监听某个端口,并为每个发出请求的用户建立用户空间线程,这个线程负责接收记录用户的信息,更新用户名单列表,接收用户的发送线程发出的数据,并交给服务器转发线程进行转发。服务器转发线程根据用户名单列表,逐一发送转发数据到每个用户的接收线程。在客户端,用户接收线程接收服务器转发的数据,由用户端主线程进行处理后显示。客户端的输入数据类型分为两类:纯
18、文本和图形对象。纯文本用于客户之间进行文字交谈,图形对象则包括直线、矩形、圆等图形的形式进行图形交谈。每一种数据类型都被包装成数据包(暂存在缓冲区里的形式)在网络上传送,客户端还要在接收到服务器转发同样的数据包后,进行解数据包,也就是对字符串进行分析后显示。4 共享电子白板的结构与设计流程4.1 共享电子白板的系统结构本系统将采用 Client/Server(C/S)体系结构,即客户机/服务器体系结构。C/S 结构主要应用于构造数据库系统,它包括连接在一个网络中的多台计算机。处理应用程序并请求另一台计算机服务的计算机称为客户机,处理数据库的计算机成为服务器。其特点是客户端只装载应用软件,而把数
19、据库放要服务器上,这样就可以使客户端不需要存储数据,从而简化客户端软件。C/S 体系结构可以如下图所示。第 4 页 共 26 页客户端 1客户端 2客户端 N服 务 器交换机图 1 C/S 体系结构共享电子白板系统也采用 C/S 结构。共享电子白板的服务器专门用于监控用户状态和转发消息,当客户端要和服务器端进行通信时,客户端只需把用户名和消息文本或图形信息等发送到服务器,然后由服务器转发到各个用户,再由客户端把接收的信息在相应的位子控件上显示出来,而不需要向每个用户建立连接后再发送消息,这样就大大减轻了客户端的任务。4.2 共享电子白板信息流设计共享电子白板就是一个服务器端和多个同步的客户端进
20、行信息交流的过程,这种结构就是 C/S 体系结构的信息流处理过程,本共享电子白板的信息流处理如下图所示。第 5 页 共 26 页服 务 器 端系 统 启 动系 统 监 听 及 信息 处 理服 务 器 系 统 退出客 户 端连 接 服 务 器消 息 处 理客户端退出连接请求发 送 信 息接 收 转 发 信 息系统退出请求图 2 共享电子白板的信息流处理图共享电子白板大致的实现模型是:1)服务器分配一个端口号。如果客户请求一个连接,服务器使用 accept()方法打开 socket 连接,从而进行了正常的信息通信。2)客户在 host 的 port 端口建立连接。服务器和客户使用 InputStr
21、eam 和 OutputStream 进行通信。下面接着分析共享电子白板系统的信息传递情况。4.2.1 由客户端向服务器端传递的主要消息1)登录链接时,在发送消息前面添加上“PEOPLE:”再加上用户名称用引号(:)隔开,再加上 IP 地址信息传给服务器。2)在发送纯文字信息时,在消息前面添加上“MSG:”,再加上发送信息的用户名称再用引号(:)隔开,再加上要发送的纯文字的消息信息。然后发送给服务器。3)在发送图形信息中的文本信息时,在消息前面添加上“DRAW:”,再加上文本关键字名后加上引号(:),再加上发送信息的用户名加上引号(:),再加上颜色分为红(R:)、绿(G:)、蓝(B:),这些颜
22、色对文本字体没有任何的作用,只是便于客户端的接收分析,再加上起点和终点的坐标值,每一个坐标的(X,Y)值都要用同样的引号(:)隔开,再加上文本信息和引号(:)。然后发送给服务器。第 6 页 共 26 页4)在发送图形信息中的线图时,在消息前面添加上“DRAW:”,再加上所绘画图形的关键字名后加上引号(:),再加上发送信息的用户名加上引号(:),再加上颜色分为红(R:)、绿(G:)、蓝(B:),再加上起点和终点坐标值,每一个坐标的(X,Y)值都要用同样的引号(:)隔开。然后发送给服务器。5)在用户退出共享电子白板系统时,发送消息中添加“QUIT:”以及退出系统的用户名称,然后将消息传送给服务器。
23、信息的发送都是以字符的形式发送出去的,通过暂缓冲区缓存方法暂存后发送给服务器端的,格式一般如下图所示。图形绘制的各个值之间都要用引号(:)隔开。关 键 字 信 息 头 : 用 户 名 称 : 纯 文 字 和 图 形 绘 制 信 息 :图 3 发送信息格式4.2.2 由服务器端向客户端传递的主要消息1)服务器进行链接起动服务器工作。2)服务器管理员可以向所示已登录链接成功的用户发送任何信息。在消息前面添加上“MSG:”,再加上“SERVER:”再加上所要发送的文字信息。3)用户登录链接时向其他所有已登录的用户发出更新消息,在消息前面添加“PEOPLE:”以及登录链接的用户名称,然后发送给所有已登
24、录的用户端。4)收到用户的纯文字、图形消息信息时,服务器则把它以同样的格式向所有已链接登录的用户转发信息出去给客户端。5)有用户注销时,向所有要线的用户发出通知,在消息前面添加上“QUIT:”信息和用户名称,同时更新用户列表信息,然后发送给所有客户进行更新和显示。6)当服务器退出时,服务器向所有在线客户发送服务器关闭信息,在消息前面添加上“QUIT:”和“SERVER:”信息,并关闭所有服务链接。信息的发送都是以字符的形式发送出去的,通过缓冲区缓存方法暂存后发送或转发的给所有在线客户端,格式一般如下图所示。图形绘制的各个值之间都要用引号(:)隔开。关 键 字 信 息 头 : 用 户 名 称 :
25、 纯 文 字 和 图 形 绘 制 信 息 :图 4 发送或转发信息格式第 7 页 共 26 页4.3 共享电子白板的设计流程4.3.1 服务器端程序设计流程按照服务器打开链接到关闭的顺序,可以将服务器端程序设计流程描述如下几等。1)创建服务器,初始化服务器套接字,并使其处于监听状态。2)当用户登录链接时,将目前的在线用户列表发给该用户,在服务器列表中记录该用户的登录链接信息,并显示在服务器端的相应位子,将该用户添加到在线用户列表中,记录用户列表中的人数,并显示出现在的在线人数用多少个。3)在发送消息时,服务器只是把从客户端接收的信息进行转发的功能形式。4)若某用户注销,则向所有在线用户发送通知
26、,通知该用户关闭信息,同时在服务器列表中记录该项用户的注销信息,并从登录链接用户列表中将该用户删除掉,同时也要记录更新服务器在线用户列表中的人数,发送给所有在线用户,并显示在相应的位子。5)当服务器需要退出时,向所有用户发送关闭的信息,然后注销所有用户列表,服务器关闭信息发送通知所有用户。4.3.2 客户端程序设计流程按照用户从登录到注销的顺序,客户端程序设计流程如下所示。1)用户登录连接服务器,把用户名称和 IP 地址信息发送给服务器,建立起一个连接。2)接收服务器消息,对不同的消息采用不同的处理方法: 当收到用户登录连接返回的消息时,从中提取出已经登录用户列表,并逐个的添加到用户端的用户列
27、表中。 收到用户发送来的消息,也就是服务器转发过来的消息时,显示在相应的消息框中。 收到其他用户注销的消息时,从用户列表中删除用户,更新用户列表,也就是用服务器转发的更新后的用户列表去一个个的添加到客户端的用户列表中。3)发送消息时,对不同的消息发送方式采用不同的处理方法:对发送纯文字信息和图形绘制信息的关键字标记都不一样,便于服务器端转发和客户端接收的分析显示。4)断开连接。若用户断开与服务器端的连接,则发送一个消息给服务器表示退出服务器连接,这一消息前面要添加“QUIT:”以及退出用户名称信息。第 8 页 共 26 页5 共享电子白板的实现5.1 实现共享电子白板的语言和环境在编程语言的选
28、择上,考虑到电子白板系统具有如下特点: 系统主要进行网络连接和数据传送; 客户端存在不同类型的输入数据类型,例如各种几何图形和文字等; 系统中存在多个线程,并且彼此之间要进行通信; 而且本人对 Java 编程语言特别的感兴趣,又一直在学习这门编程语言,因而决定选用 Java 语言,因为 Java 是一种面向对象的网络编程语言,它支持多线程,并且,Java 的平台无关性以及安全性更是其他编程语言无法比拟的。 选 择 Borland Jbuilder 9.0 作为开发工具,它是一个强大的集成 Java 软件开发工具,使用 JDK1.4 进行开发,在实现共享电子白板中,主要了使用Java 语言中的下
29、面几个类: java.lang.Thread;用来建立线程,或者使用 Runnable 界面。可以为线程设 置 优先级,使用 synchronized()指令来锁定临界区、同步通讯等。 .ServerSocket;用来建立服务器端 Socket,并与某个端口绑定,使用 accept()方法返回连接建立后的 Socket 对象。 .Socket;用来与某主机的某个端口建立 Socket 连接,使用getInputStream()和 getOutputStream()方法获得输入和输出的流对象。 .InetAddress;用来获得和处理主机的网络地址,使用静态方法 getByName()获得 In
30、etAddress 类对象,使用 getAddress()和 getHostName()获得主机的 IP 地址和域名。 共享电子白板中的 Socket 编程,它是用来实现底层网络的通信, 当一个Socket 建立后,它就与本地的 IP 地址联系起来,IP 地址仅简单地指定出入主机的特定路径,而连接亦可有多个。套接字地址完整地说是应用端口号,协议和本地 IP 地址的集合,它形成一个应用链路的终点,有效的激活一个套接字到套接字的连接。Socket 通信机制提供了两种通信方式,即:面向连接的通信方式和面向无连接的方式。在设计时我们采用了前者-面向连接的通信方式,即通信前必须进行一次连接,从而建立起一
31、条通信链路,并以字节流的形式在通信双方之间进行数据传输服务,它是一种安全、可靠的通信方式。在服务器端的是用 serverSocket 类,serverSocket 连接后,还要调用 accept()方法去监听,直得注意的是使用了一个 while(true)语句去实现时时的轮询。相关代码:final static int DEFAULT_PORT=4000;void link_actionPerformed(ActionEvent e) 第 9 页 共 26 页if (serverSocket = null) try serverSocket = new ServerSocket(DEFAULT
32、_PORT);class watch extends ThreadServerSocket serverSocket = null;public void run()while (true) if (frame.clients.size() Math.abs(e.getY() - p1.y) if (Math.abs(p2.x - p1.x) Math.abs(p2.y - p1.y) g.drawOval(p1.x, p1.y, Math.abs(p2.x - p1.x),Math.abs(p2.x - p1.x);else g.drawOval(p1.x, p1.y, Math.abs(p
33、2.y - p1.y),Math.abs(p2.y - p1.y);g.setColor(colour);g.drawOval(p1.x, p1.y, Math.abs(e.getX() - p1.x),Math.abs(e.getX() - p1.x);else if (Math.abs(p2.x - p1.x) Math.abs(p2.y - p1.y) g.drawOval(p1.x, p1.y, Math.abs(p2.x - p1.x),Math.abs(p2.x - p1.x);else g.drawOval(p1.x, p1.y, Math.abs(p2.y - p1.y),Ma
34、th.abs(p2.y - p1.y);g.setColor(colour);g.drawOval(p1.x, p1.y, Math.abs(e.getY() - p1.y),Math.abs(e.getY() - p1.y);p2 = e.getPoint();break;case 3: /画矩形g.setColor(this.getBackground();g.drawRect(p1.x, p1.y, Math.abs(p2.x - p1.x), Math.abs(p2.y - p1.y);g.setColor(colour);g.drawRect(p1.x, p1.y, Math.abs
35、(e.getX() - p1.x),第 20 页 共 26 页Math.abs(e.getY() - p1.y);p2 = e.getPoint();break;case 4: /画椭圆g.setColor(this.getBackground();g.drawOval(p1.x, p1.y, Math.abs(p2.x - p1.x), Math.abs(p2.y - p1.y);g.setColor(colour);g.drawOval(p1.x, p1.y, Math.abs(e.getX() - p1.x),Math.abs(e.getY() - p1.y);p2 = e.getPoi
36、nt();break;case 5: /画填充圆g.setColor(this.getBackground();g.fillOval(p1.x, p1.y, Math.abs(p2.x - p1.x), Math.abs(p2.y - p1.y);g.setColor(colour);g.fillOval(p1.x, p1.y, Math.abs(e.getX() - p1.x),Math.abs(e.getY() - p1.y);p2 = e.getPoint();break;客户端获得的画图的起始点和终点的座标值,并把座标值发送去,实现这些功能的方法分析是 Frame1 类里面的 void
37、 jScrollPane1_mousePressed(MouseEvent e)和 void jScrollPane1_mouseReleased(MouseEvent e),其功能代码如下。void jScrollPane1_mousePressed(MouseEvent e) if (bootf = true) p1 = e.getPoint();p2 = p1;x1 = p1.x;y1 = p1.y;void jScrollPane1_mouseReleased(MouseEvent e) if (bootf = true) StringBuffer draw = new StringB
38、uffer(“DRAW:“);p1 = e.getPoint();p2 = p1;x2 = p2.x;y2 = p2.y;if (lineType = 6) if (bootf != false) g = (Graphics2D) jScrollPane1.getGraphics();JOptionPane optionPane = new JOptionPane();第 21 页 共 26 页text = optionPane.showInputDialog( (Component) e.getSource(),“请输入文字:“,“Dialog for text input“,JOption
39、Pane.PLAIN_MESSAGE);if (text != null) g.drawString(text, x1, y1);draw.append(keystr + “:“ + listen.name + “:“ + R + “:“ + G + “:“ +B +“:“+ “:“ + String.valueOf(x1) + “:“ + String.valueOf(y1) +“:“+ String.valueOf(x2) + “:“ + String.valueOf(y2) + “:“ +text + “:“);else draw.append(keystr + “:“ + listen
40、.name + “:“ + R + “:“ + G + “:“ +B+ “:“ +String.valueOf(x1) + “:“ + String.valueOf(y1) + “:“ + String.valueOf(x2) + “:“ + String.valueOf(y2) + “:“);ps.println(draw);ps.flush();3) Listen 类,这个类是客户端的监听线程类,是用来监听从服务器发送过来的数据,同时是客户端对数据进行分析显示的类。当客户端接收到服务器转发的数据后,它进行分析是否是纯文字信息、图形绘制信息、服务器或客户端退出信息和用户名称不符合的退出信息,
41、并进行一一实现的功能。这个类的主要功能都是这 run()方法中,其代码实现如下。public void run()String message = null;while (true) try message = dis.readLine();catch (IOException ex) jTextArea1.append(“Error: “ + ex + “ n “);frame.disconnect(); if (message = null) frame.listen = null;frame.socket = null;frame.list1.clear();return ;String
42、Tokenizer strword = new StringTokenizer(message,“:“);String keyword = strword.nextToken();if (keyword.equalsIgnoreCase(“PEOPLE“) frame.count = 0;frame.list1.clear();while (strword.hasMoreTokens() String stname = strword.nextToken();第 22 页 共 26 页frame.list1.addItem(stname);frame.count+;jTextField3.se
43、tText(“目前连接用户数: “ + String.valueOf(frame.count);else if (keyword.equalsIgnoreCase(“MSG“) String usr = strword.nextToken();jTextArea1.append(usr);jTextArea1.append(strword.nextToken(“0“);jTextArea1.append(“n“);else if (keyword.equalsIgnoreCase(“DRAW“) g = frame.jScrollPane1.getGraphics();if (strword.
44、hasMoreTokens() keystr = strword.nextToken();if (strword.hasMoreTokens() strname = strword.nextToken();if (strword.hasMoreTokens() Rr = strword.nextToken();R = Integer.parseInt(Rr);if (strword.hasMoreTokens() Gg = strword.nextToken();G = Integer.parseInt(Gg);if (strword.hasMoreTokens() Bb = strword.
45、nextToken();B = Integer.parseInt(Bb);if (strword.hasMoreTokens() p1x = strword.nextToken();x1 = Integer.parseInt(p1x);if (strword.hasMoreTokens() p1y = strword.nextToken();y1 = Integer.parseInt(p1y);if (strword.hasMoreTokens() p2x = strword.nextToken();x2 = Integer.parseInt(p2x);if (strword.hasMoreT
46、okens() p2y = strword.nextToken();y2 = Integer.parseInt(p2y);if (strword.hasMoreTokens() text = strword.nextToken();if (keystr.equalsIgnoreCase(“LINE“) frame.jTextArea2.append(strname + “ : “ + “画直线n“);g.setColor(new Color(R, G, B);g.drawLine(x1, y1, x2, y2);else if (keystr.equalsIgnoreCase(“ROUND“)
47、 frame.jTextArea2.append(strname + “ : “ + “画圆形n“);第 23 页 共 26 页if (Math.abs(x2 - x1) Math.abs(y2 - y1) g.setColor(new Color(R, G, B);g.drawOval(x1, y1, Math.abs(x2 - x1), Math.abs(x2 - x1);else g.setColor(new Color(R, G, B);g.drawOval(x1, y1, Math.abs(y2 - y1), Math.abs(y2 - y1);else if (keystr.equ
48、alsIgnoreCase(“RECT“) frame.jTextArea2.append(strname + “ : “ + “画矩形n“);g.setColor(new Color(R, G, B);g.drawRect(x1, y1, Math.abs(x2 - x1), Math.abs(y2 - y1);else if (keystr.equalsIgnoreCase(“ELLIPSE“) frame.jTextArea2.append(strname + “ : “ + “画椭圆n“);g.setColor(new Color(R, G, B);g.drawOval(x1, y1,
49、 Math.abs(x2 - x1), Math.abs(y1 - y2);else if (keystr.equalsIgnoreCase(“FILLOVAL“) frame.jTextArea2.append(strname + “ : “ + “画填充圆n“);g.setColor(new Color(R, G, B);g.fillOval(x1, y1, Math.abs(x2 - x1), Math.abs(y2 - y1);else if (keystr.equalsIgnoreCase(“TEXT“) frame.jTextArea2.append(strname + “ : “ + “写文本n“);g.drawString(text, x1, y1);else if (keyword.equa