﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-孙岩的WEB LOG-文章分类-JAVA</title><link>http://www.cnitblog.com/sunyan/category/1311.html</link><description>孙岩的WEB LOG</description><language>zh-cn</language><lastBuildDate>Fri, 14 Oct 2011 04:48:19 GMT</lastBuildDate><pubDate>Fri, 14 Oct 2011 04:48:19 GMT</pubDate><ttl>60</ttl><item><title>使用Java JDK中Java.net包控制UDP协议</title><link>http://www.cnitblog.com/sunyan/articles/4535.html</link><dc:creator>孙 岩</dc:creator><author>孙 岩</author><pubDate>Tue, 15 Nov 2005 05:04:00 GMT</pubDate><guid>http://www.cnitblog.com/sunyan/articles/4535.html</guid><wfw:comment>http://www.cnitblog.com/sunyan/comments/4535.html</wfw:comment><comments>http://www.cnitblog.com/sunyan/articles/4535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunyan/comments/commentRss/4535.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunyan/services/trackbacks/4535.html</trackback:ping><description><![CDATA[　什么是UDP协议
<P>　　UDP协议的全称是用户数据报，在网络中它与TCP协议一样用于处理数据包。在OSI模型中，在第四层——传输层，处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点，也就是说，当报文发送之后，是无法得知其是否安全完整到达的。</P>
<TABLE cellSpacing=5 cellPadding=0 align=left border=0>
<TBODY>
<TR>
<TD><!--FLASH 画中画360X300-->[Blocked Ads]</TD></TR></TBODY></TABLE>
<P>　　为什么要使用UDP</P>
<P>　　在选择使用协议的时候，选择UDP必须要谨慎。在网络质量令人不十分满意的环境下，UDP协议数据包丢失会比较严重。但是由于UDP的特性：它不属于连接型协议，因而具有资源消耗小，处理速度快的优点，所以通常音频、视频和普通数据在传送时使用UDP较多，因为它们即使偶尔丢失一两个数据包，也不会对接收结果产生太大影响。比如我们聊天用的ICQ和OICQ就是使用的UDP协议。</P>
<P>　　在Java中操纵UDP</P>
<P>　　使用位于JDK中Java.net包下的DatagramSocket和DatagramPacket类，可以非常方便地控制用户数据报文。</P>
<P>　　在描述它们之前，必须了解位于同一个位置的InetAddress类。InetAddress实现了Java.io. Serializable接口，不允许继承。它用于描述和包装一个Internet IP地址，通过三个方法返回InetAddress实例：</P>
<P>　　getLocalhost()：返回封装本地地址的实例。</P>
<P>　　getAllByName(String host)：返回封装Host地址的InetAddress实例数组。</P>
<P>　　getByName(String host)：返回一个封装Host地址的实例。其中，Host可以是域名或者是一个合法的IP地址。</P>
<P>　　DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl类一样，DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。DatagramSocket类有3个构建器：</P>
<P>　　DatagramSocket()：创建实例。这是个比较特殊的用法，通常用于客户端编程，它并没有特定监听的端口，仅仅使用一个临时的。</P>
<P>　　DatagramSocket(int port)：创建实例，并固定监听Port端口的报文。</P>
<P>　　DatagramSocket(int port, InetAddress localAddr)：这是个非常有用的构建器，当一台机器拥有多于一个IP地址的时候，由它创建的实例仅仅接收来自LocalAddr的报文。</P>
<P>　　值得注意的是，在创建DatagramSocket类实例时，如果端口已经被使用，会产生一个SocketException的异常抛出，并导致程序非法终止，这个异常应该注意捕获。DatagramSocket类最主要的方法有4个：</P>
<P>　　Receive(DatagramPacket d)：接收数据报文到d中。receive方法产生一个“阻塞”。</P>
<P>　　Send(DatagramPacket d)：发送报文d到目的地。</P>
<P>　　SetSoTimeout(int timeout)：设置超时时间，单位为毫秒。</P>
<P>　　Close()：关闭DatagramSocket。在应用程序退出的时候，通常会主动释放资源，关闭Socket，但是由于异常地退出可能造成资源无法回收。所以，应该在程序完成时，主动使用此方法关闭Socket，或在捕获到异常抛出后关闭Socket。</P>
<P>　　“阻塞”是一个专业名词，它会产生一个内部循环，使程序暂停在这个地方，直到一个条件触发。</P>
<P>　　DatagramPacket类用于处理报文，它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。应用程序在产生数据包是应该注意，TCP/IP规定数据报文大小最多包含65507个，通常主机接收548个字节，但大多数平台能够支持8192字节大小的报文。DatagramPacket类的构建器共有4个：</P>
<P>　　DatagramPacket(byte[] buf, int length, InetAddress addr, int port)：从Buf数组中，取出Length长的数据创建数据包对象，目标是Addr地址，Port端口。</P>
<P>　　DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)：从Buf数组中，取出Offset开始的、Length长的数据创建数据包对象，目标是Addr地址，Port端口。</P>
<P>　　DatagramPacket(byte[] buf, int offset, int length)：将数据包中从Offset开始、Length长的数据装进Buf数组。</P>
<P>　　DatagramPacket(byte[] buf, int length)：将数据包中Length长的数据装进Buf数组。</P>
<P>　　DatagramPacket类最重要的方法就是getData()了，它从实例中取得报文的Byte数组编码。</P>
<P>　　★简单的实例说明</P>
<P>　　{接收数据的服务器}</P>
<P>　　byte[] buf = new byte[1000]; </P>
<P>　　DatagramSocket ds = new DatagramSocket(12345); </P>
<P>　　//开始监视12345端口</P>
<P>　　DatagramPacket ip = new DatagramPacket(buf, buf.length); </P>
<P>　　//创建接收数据报的实例</P>
<P>　　while (true) </P>
<P>　　{</P>
<P>　　ds.receive(ip); </P>
<P>　　//阻塞，直到收到数据报后将数据装入IP中</P>
<P>　　System.out.println(new String(buf)); </P>
<P>　　}</P>
<P>　　{发送数据的客户端}</P>
<P>　　InetAddress target = InetAddress.getByName("www.xxx.com");</P>
<P>　　//得到目标机器的地址实例</P>
<P>　　DatagramSocket ds = new DatagramSocket(9999); </P>
<P>　　//从9999端口发送数据报</P>
<P>　　String hello = "Hello, I am come in!";</P>
<P>　　//要发送的数据</P>
<P>　　byte[] buf = hello.getBytes();</P>
<P>　　//将数据转换成Byte类型</P>
<P>　　op = new DatagramPacket(buf, buf.length, target, 12345); </P>
<P>　　//将BUF缓冲区中的数据打包</P>
<P>　　ds.send(op); </P>
<P>　　//发送数据</P>
<P>　　ds.close();</P>
<P>　　//关闭连接</P><img src ="http://www.cnitblog.com/sunyan/aggbug/4535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunyan/" target="_blank">孙 岩</a> 2005-11-15 13:04 <a href="http://www.cnitblog.com/sunyan/articles/4535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的常用方法说明 4</title><link>http://www.cnitblog.com/sunyan/articles/4534.html</link><dc:creator>孙 岩</dc:creator><author>孙 岩</author><pubDate>Tue, 15 Nov 2005 05:03:00 GMT</pubDate><guid>http://www.cnitblog.com/sunyan/articles/4534.html</guid><wfw:comment>http://www.cnitblog.com/sunyan/comments/4534.html</wfw:comment><comments>http://www.cnitblog.com/sunyan/articles/4534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunyan/comments/commentRss/4534.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunyan/services/trackbacks/4534.html</trackback:ping><description><![CDATA[第二十四章 Java与多媒体 <BR>1、在小程序中播放声音 <BR>java可以播放au,aiff,wav,midi,rfm格式的音频 <BR>可以调用Applet的一个静态方法： <BR>newAudioClip(URL url,String name) url是地址，name是音频名称 <BR>也可以用Applet类的实例方法： <BR>getAudioClip(URL url,String name) <BR>根据url地址和声音文件name，获得一个用于播放的音频对象，这对象可以使用下面的方法来处理声音： <BR>play() 播放声音文件name <BR>loop() 循环播放name <BR>stop() 停止播放name <BR>2、Java媒体框架(JMF) <BR>创建播放器 <BR>try <BR>{ <BR>URL url=new URL(getDocumenBase(),视频文件名称); <BR>player player=Manager.createPlayer(url); <BR>} <BR>catch(IOException e){} <BR>向播放器注册控制监视器 <BR>player.addControllerListener(监视器); <BR>创建监视器必须使用接口ControllerListener ，该接口中的方法是 <BR>public void controllerUpdate(ControllerEvent e) <BR>让播放器对媒体进行预提取 <BR>player.prefetch() <BR>启动播放器 <BR>player.start(); <BR>停止播放器 <BR>player.stop(); <BR>停止播放器后必须释放内存中的资源 <BR>player.deallocate(); <BR><BR>第二十五章 Java Swing基础 <BR>1、Jcomponent类 <BR>Jcomponent类 是所有轻量组件的父类，主要的子类有： <BR>JButton 创建按钮对象，而且可以创建在图标的按钮 <BR>JComboBox 创建组合框对象，和Choice相似 <BR>JCheckBox 创建复选框对象 <BR>JFileChooser 创建文件选择器 <BR>JInternalFrame 创建内部窗体 <BR>JLabel 创建标签 <BR>JMenu 创建菜单对象 <BR>JMenuBar 创建菜单条对象 <BR>JMenuItem 创建菜单项对象 <BR>JPanel 创建面板对象 <BR>JPasswordField 创建口令文本对象 <BR>JPopupMenu 创建弹出式菜单 <BR>JProgressBar 创建进程条 <BR>JRadioButton 创建单选按钮 <BR>JScrollBar 创建滚动条 <BR>JScrollPane 创建滚动窗格 <BR>JSlider 创建滚动条 <BR>JSplitPane 创建拆分窗格 <BR>JTable 创建表格 <BR>JTextArea 创建文本区 <BR>JTexPane 创建文本窗格 <BR>JToolBar 创建工具条 <BR>JToolTip 创建工具提示对象 <BR>JTree 创建树对象 <BR>2、JFrame类 <BR>JFrame类及其子类创建的对象是窗体 <BR>（1）JFrame类及其子类创建的窗体是swing窗体 <BR>（2）不可以把组件直接加到swing窗体中，应该把组件加到内容面板中 <BR>（3）不能为swing窗体设置布局，而应当为内容面板设置布局 <BR>（4）swing窗体通过调用getContentPane()方法得到它的内容面板 <BR>3、JApplet类 <BR>（1）不可以把组件直接添加到小程序容器中，也应该添加到内容面板中 <BR>（2）不能为小程序设置布局 <BR>（3）小程序容器通过调用getContenPane()方法得到内容面板 <BR>4、JDialog类 <BR>（1）不可以把组件直接添加到对话框容器中，也应该添加到内容面板中 <BR>（2）不能为对话框设置布局 <BR>（3）对话框容器通过调用getContenPane()方法得到内容面板 <BR>5、JPanel面板 <BR>JPanel() <BR>JPanel(布局对象) <BR>6、滚动窗口JScrollPane <BR>JScrollPane() <BR>JScrollPane(component c) <BR>7、拆分窗口JSplitPane <BR>JSplitPane(int a,Component b,Component c) <BR>a的取值是HORIZONTAL_SPLIT或者VERTICAL_SPLIT决定水平拆分还是垂直拆分 <BR>JSplitPane(int a,boolean b ,Component b,Component c) b的取值决定拆分线移动的时候组件是否连续变化 <BR>8、内部窗体JInternalFrame <BR>JInternalFrame(String title,boolean resizable,booleam closable,boolean max,boolean min) <BR>参数的意义分别是窗口名称，是否能调整大小，是否有关闭按钮，最大化按钮，最小化按钮 <BR>（1）不能把组件直接加到窗体中，而是加到内容面板中 <BR>（2）必须先把内部窗体加到一个容器中（JDesktopPane），该容器是专门为内部窗体服务的 <BR>9、按钮（JButton） <BR>JButton() 创建按钮 <BR>JButton(String s) s是按钮的名字 <BR>JButton(Icon icon) icon是按钮上的图标 <BR>JButton(String s,Icon icon) <BR>getText() 获取按钮名字 <BR>getIcon() 获取按钮图标 <BR>setIcon(Icon icon) 设置按钮图标 <BR>setHorizontalTextposition(int a) a确定按钮上图标的位置，取值： <BR>AbstractButton_CENTR,AbstractButton_LEFT,AbstractButton_RIGHT <BR>setVerticalTextposition(int a) a确定按钮上名字相对图标的位置，取值： <BR>AbstractButton.TOP，AbstractButton.BOTTOM，AbstractButton.CENTR <BR>setMnemonic(char c) 设置按钮的键盘操作方式是字符c（Alt+c） <BR>setEnabled(boolean b) b决定按钮是否可以被单击 <BR><img src ="http://www.cnitblog.com/sunyan/aggbug/4534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunyan/" target="_blank">孙 岩</a> 2005-11-15 13:03 <a href="http://www.cnitblog.com/sunyan/articles/4534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的常用方法说明 3</title><link>http://www.cnitblog.com/sunyan/articles/4533.html</link><dc:creator>孙 岩</dc:creator><author>孙 岩</author><pubDate>Tue, 15 Nov 2005 05:02:00 GMT</pubDate><guid>http://www.cnitblog.com/sunyan/articles/4533.html</guid><wfw:comment>http://www.cnitblog.com/sunyan/comments/4533.html</wfw:comment><comments>http://www.cnitblog.com/sunyan/articles/4533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunyan/comments/commentRss/4533.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunyan/services/trackbacks/4533.html</trackback:ping><description><![CDATA[第二十章 输入输出流 <BR>1、FileInputStream类 <BR>FileInputStream(String name) 使用给定的文件名name创建一个FileInputStream对象 <BR>FileInputStream(File file) 使用File对象创建FileInpuStream对象 <BR>File类有两个常用方法： <BR>File(String s) s确定文件名字 <BR>File(String directory,String s) directory是文件目录 <BR>例如： <BR>File f=new File("Myfile.dat"<IMG src="http://www.blueidea.com/bbs/images/wink.gif">; <BR>FileInputStream istream=new FileInputStream(f); <BR>处理I/O异常 <BR>当出现I/O错误的时候，Java生成一个IOException(I/O异常)对象来表示这个错误的信号。 <BR>程序必须使用一个catch检测这个异常 <BR>例如： <BR>try{ <BR>FileInputStream ins= new FileInputStream("Myfile.dat"<IMG src="http://www.blueidea.com/bbs/images/wink.gif">; <BR>} <BR>catch(IOException e){ <BR>System.out.println("File read Error:"+e); <BR>} <BR>从输入流中读取字节 <BR>int read() 返回0~255之间一个整数，如果到输入流末尾，则返回-1 <BR>int read(byte b[]) 读取字节数组 <BR>int read(byte b[],int off,int len) off指定把数据存放在b中什么地方，len指定读取的最大字节数 <BR>关闭流 <BR>close() <BR>2、FileOutputStream类 <BR>FileOutputStream(String name) 使用指定的文件名name创建FileOutputStream对象 <BR>FileOutputStream（File file） 使用file对象创建FileOutputStream对象 <BR>FileOutputStream（FileDescriptor fdobj） 使用FileDescriptor对象创建FileOutputStream对象 <BR>3、FileReader类和FileWriter类 <BR>FileReader(String filename) <BR>FileWriter(String filename) <BR>处理时需要FileNotFoundException异常 <BR>4、RandomAccessFile类 <BR>RandomAccessFile不同于FileInputStream和FileOutputStream,不是他们的子类 <BR>当我们想对一个文件进行读写操作的时候，创建一个指向该文件的RandomAccessFile流就可以了 <BR>RandomAccessFile类有两个构造方法： <BR>RandomAccessFile（String name, String mode） name是文件名，mode取r(只读)或rw(读写) <BR>RandomAccessFile（File file,String mode） file给出创建流的源 <BR>seek(long a) 移动RandomAccessFile流指向文件的指针,a确定指针距文件开头的位置 <BR>getFilePointer() 获取当前文件的指针位置 <BR>close() 关闭文件 <BR>getFD() 获取文件的FileDescriptor <BR>length() 获取文件长度 <BR>read() 读取一个字节数据 <BR>readBoolean() 读取一个布尔值 <BR>readByte() 读取一个字节 <BR>readChar() <BR>readFloat() <BR>readFully(byte b[]) <BR>readInt() <BR>readLine() <BR>readLong() <BR>readUnsignedShort() <BR>readUTF() 读取一个UTF字符串 <BR>setLength(long newLength) 设置文件长度 <BR>skipByte(int n) 在文件中跳过给定数量的字节 <BR>write(byte b[]) 写b.length个字节到文件 <BR>writeBoolean(bolean b) <BR>writeByte(int v) <BR>writeChar(char c) <BR>writeChars(String s) <BR>writeDouble(double d) <BR>writeFloat(float v) <BR>writeInt(int i) <BR>writeLong(long l) <BR>writeShort(int i) <BR>writeUTF(String s) <BR>5、管道流 <BR>PipedInputStream类 <BR>PipedInputStream() 创建一个管道输入流 <BR>PipedInputStream（PipedOutputStream a） 连接到输出流a的输入流 <BR>read() 从输入流中读取一个字节 <BR>read(byte b[],int off,int len) off是在b中的开始位置，len是字节长度 <BR>PipedOutputStream类 <BR>PipedOutputStream() 创建一个输出流 <BR>PipedOutputStream(PipedInputStream a) 连接到输入流a的输出流 <BR>write(int b) <BR>write(byte b[],int off,int len) <BR>counnect() 连接输入输出流 <BR>close() 关闭流 <BR>在使用的时候要捕获IOException异常。 <BR>6、数据流 <BR>DataInputStream类(数据输入流) <BR>DataInputStream(InputStream in) 将数据输入流指向一个由in指定的输入流 <BR>DataOutputStream类(数据输出流) <BR>DataOutputStream(OutputStream out) 将数据输出流指向一个由out指定的输出流 <BR>主要方法： <BR>close() <BR>read() 读取一个字节数据 <BR>readBoolean() 读取一个布尔值 <BR>readByte() 读取一个字节 <BR>readChar() <BR>readFloat() <BR>readFully(byte b[]) <BR>readInt() <BR>readLine() <BR>readLong() <BR>readUnsignedShort() <BR>readUTF() 读取一个UTF字符串 <BR>skipByte(int n) 在文件中跳过给定数量的字节 <BR>write(byte b[]) 写b.length个字节到文件 <BR>writeBoolean(bolean b) <BR>writeByte(int v) <BR>writeChar(char c) <BR>writeChars(String s) <BR>writeDouble(double d) <BR>writeFloat(float v) <BR>writeInt(int i) <BR>writeLong(long l) <BR>writeShort(int i) <BR>writeUTF(String s) <BR>7、对象流 <BR>ObjectInputStream类和ObjectOutputStream类分别是DataInputStream类和DataOutputStream类的子类 <BR>8、回压输入流 <BR>PushbackInputStream类 <BR>PushbackInputStream(InputStream in) <BR>PushbackReader类 <BR>PushbackReader(Reader in) <BR>unread(char c) 回压一个字符 <BR>unread(char c[]) 回压数组c中全部字符 <BR>unread(char c[],offset,int n) 回压c中从offset开始的n个字符 <BR><BR>第二十一章 java网络的基本知识 <BR>1、使用URL（统一资源定位） <BR>例如： <BR>try <BR>{ <BR>url=new URL("http://www.sina.com.cn"<IMG src="http://www.blueidea.com/bbs/images/wink.gif">; <BR>} <BR>catch(MalformedURLException e) <BR>{ <BR>System.out.println("Bad URL:"+url); <BR>} <BR>在Applet 中链接向另外的Web页面，使用代码： <BR>getAppletContext().showDocument(url); <BR>2、套接字 <BR>客户建立到服务器的套接字（Socket） <BR>Socket(String host,int port) host是服务器的IP地址，port是端口号 <BR>建立了套接字后可以使用getInputStream()获得输入流 <BR>还可以使用getOutputStream()获得一个输出流 <BR>服务器建立接受客户套接字的服务器套接字（ServerSocket） <BR>ServerSocket(int port) port是端口号 <BR>建立了套接字连接后可以使用accept()接收客户的套接字 <BR>可以使用getOutputStream()获得一个输出流 <BR>还可以使用getInputStream()获得一个输入流 <BR>3、InetAddress类 <BR>getByName(String s) 获取Internet上主机的地址 <BR>getHostName() 获取InetAddress对象所包含的域名 <BR>getHostAddress() 获取InetAddress对象所包含的IP地址 <BR>getLocalHost() 获取本地地址 <BR>4、UDP数据报 <BR>发送数据包，即使用DatagramPacket类将数据打包,有两种构造方法 <BR>DatagramPacket(byte data[],int length,InetAddress address,int port) <BR>?含有data数组的数据 <BR>?该数据包将发送到地质是address，端口是port的主机上 <BR>DatagramPacket(byte data[],int offset,int length,InetAddress address,int port) <BR>?含有data数组的从offset开始，length长度的数据 <BR>?该数据包将发送到地质是address，端口是port的主机上 <BR>接收数据包，即使用DatagramSocket（int port）创建一个对象，port必须和待接收的数据包的端口相同 <BR>例如： <BR>如果发送方的数据包端口是5566 <BR>DatagramSocket mail=new DatagramSocket(5566); <BR>然后对象mail可以使用方法receive（Datagrampacket pack）接收数据包 <BR>在使用参数pack 接收数据包前，必须创建pack <BR>byte data[]=new byte[100]; <BR>int length=90; <BR>DatagramPacket pack=new DatagramPataet(data,length); <BR>mail.receive(pack); <BR>该数据包pack将接收长度是length的数据放入data,注意数据长度不要超过8192KB <BR>pack还可以调用方法getPort()获取所接受数据包是从什么端口发出的 <BR>调用方法InetAddress getAddress()可以获知数据包来自哪个主机 <BR><BR>第二十二章 Java与图像 <BR>1、java支持的图像类型：GIF，JPEG，BMP <BR>2、Image类 <BR>首先申请一个Image对象 <BR>Image img =getImage(URL url,String name) url是图像地址，name是图片名称 <BR>通常使用： <BR>Image img =getImage(getCodBase(),String name) getCodBase()获取当前小应用程序的URL，也就是在同一目录下 <BR>图像被加载后，就可以在paint()中绘制了 <BR>drawImage(Image img,int x,int y,ImageObserver observer) <BR>img是上面获取的图像， x,y是指定图像左上角的位置，observer是加载图像时的图像观察器 <BR>Applet类已经实现了ImageObserver接口，所以可以直接使用this作为最后一个参数 <BR>drawImage(Image img,int x,int y,int width,int height,ImageObserver observer) <BR>width和height是要绘制的图像的宽和高 <BR>可以使用img.getHeight(this)和img.getWidth(this)来获取被加载的图像的宽和高 <BR>3、设置Java窗口图标 <BR>Frame对象可以使用setIconImage(Image img)方法设置左上角图标，默认图标是咖啡杯 <BR><BR>第二十三章 Java数据库连接(JDBC) <BR>1、JDBC-ODBC桥接器 <BR>建立JDBC-ODBC桥接器 <BR>try <BR>{ <BR>Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"<IMG src="http://www.blueidea.com/bbs/images/wink.gif">; <BR>} <BR>catch(ClassNotFoundException e){} <BR>连接到数据库 <BR>try <BR>{ <BR>Connection con=DriverManager.getConnection("jdbc<IMG src="http://www.blueidea.com/bbs/images/redface.gif">dbc:数据源名称","数据源的login name"， <BR>"数据源的password"<IMG src="http://www.blueidea.com/bbs/images/wink.gif"> <BR>} <BR>catch(SQLException e){} <BR>向数据库发送SQL语句 <BR>try <BR>{ <BR>Statement sql=con.createStatement(); <BR>} <BR>catch(SQLException e){} <BR>处理查询结果 <BR>ResultSet rs=sql.executeQuery("SQL语句"<IMG src="http://www.blueidea.com/bbs/images/wink.gif">; <BR><img src ="http://www.cnitblog.com/sunyan/aggbug/4533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunyan/" target="_blank">孙 岩</a> 2005-11-15 13:02 <a href="http://www.cnitblog.com/sunyan/articles/4533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的常用方法说明 1</title><link>http://www.cnitblog.com/sunyan/articles/4531.html</link><dc:creator>孙 岩</dc:creator><author>孙 岩</author><pubDate>Tue, 15 Nov 2005 05:00:00 GMT</pubDate><guid>http://www.cnitblog.com/sunyan/articles/4531.html</guid><wfw:comment>http://www.cnitblog.com/sunyan/comments/4531.html</wfw:comment><comments>http://www.cnitblog.com/sunyan/articles/4531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunyan/comments/commentRss/4531.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunyan/services/trackbacks/4531.html</trackback:ping><description><![CDATA[第五章 字符串 <BR><BR>1、获取字符串的长度 <BR>length() <BR>2 、判断字符串的前缀或后缀与已知字符串是否相同 <BR>前缀 startsWith(String s) <BR>后缀 endsWith(String s) <BR>3、比较两个字符串 <BR>equals(String s) <BR>4、把字符串转化为相应的数值 <BR>int型 Integer.parseInt(字符串) <BR>long型 Long.parseLong(字符串) <BR>float型 Folat.valueOf(字符串).floatValue() <BR>double型 Double.valueOf(字符串).doubleValue() <BR>4、将数值转化为字符串 <BR>valueOf(数值) <BR>5、字符串检索 <BR>indexOf(Srting s) 从头开始检索 <BR>indexOf(String s ,int startpoint) 从startpoint处开始检索 <BR>如果没有检索到，将返回-1 <BR>6、得到字符串的子字符串 <BR>substring(int startpoint) 从startpoint处开始获取 <BR>substring(int start,int end) 从start到end中间的字符 <BR>7、替换字符串中的字符,去掉字符串前后空格 <BR>replace(char old,char new) 用new替换old <BR>trim() <BR>8、分析字符串 <BR>StringTokenizer(String s) 构造一个分析器，使用默认分隔字符（空格，换行，回车，Tab，进纸符） <BR>StringTokenizer(String s,String delim) delim是自己定义的分隔符 <BR>nextToken() 逐个获取字符串中的语言符号 <BR>boolean hasMoreTokens() 只要字符串还有语言符号将返回true，否则返回false <BR>countTokens() 得到一共有多少个语言符号 <BR><BR><BR>第六章 文本框和文本区 <BR><BR>1、文本框 <BR>TextField() 构造文本框，一个字符长 <BR>TextField(int x) 构造文本框，x个字符长 <BR>TextField(String s) 构造文本框，显示s <BR>setText(String s) 设置文本为s <BR>getText() 获取文本 <BR>setEchoChar(char c) 设置显示字符为c <BR>setEditable(boolean) 设置文本框是否可以被修改 <BR>addActionListener() 添加监视器 <BR>removeActionListener() 移去监视器 <BR>2、文本区 <BR>TextArea() 构造文本区 <BR>TextArea(String s) 构造文本区，显示s <BR>TextArea(String s,int x,int y) 构造文本区，x行，y列，显示s <BR>TextArea(int x,int y) 构造文本区，x行，y列 <BR>TextArea(String s,int x,ing y,int scrollbar) <BR>scrollbar的值是： <BR>TextArea.SCROLLBARS_BOTH <BR>TextArea.SCROLLBARS_VERTICAL_ONLY <BR>TextArea.SCROLLBARS_HORIZONTAL_ONLY <BR>TextArea.SCROLLBARS_NONE <BR>setText(String s) 设置文本为s <BR>getText() 获取文本 <BR>addTextListener() 添加监视器 <BR>removeTextListener() 移去监视器 <BR>insert(String s,int x) 在x处插入文本s <BR>replaceRange(String s,int x,int y) 用s替换从x到y处的文本 <BR>append(String s) 在文本的最后追加文本s <BR>Int getCaretPosition(int n) 获取文本区中光标的位置 <BR><BR>第九章 按钮 <BR><BR>1、按钮 <BR>Button() 构造按钮 <BR>Button(String s) 构造按钮，标签是s <BR>setLabel(String s) 设置按钮标签是s <BR>getLabel() 获取按钮标签 <BR>addActionListener() 添加监视器 <BR>removeActionListener() 移去监视器 <BR><BR>第十章 标签 <BR><BR>1、标签 <BR>Label() 构造标签 <BR>Label(String s) 构造标签，显示s <BR>Label(String s,int x) <BR>x是对齐方式，取值： <BR>Label.LEFT <BR>Label.RIGHT <BR>Label.CENTER <BR>setText(String s) 设置文本s <BR>getText() 获取文本 <BR>setBackground(Color c) 设置标签背景颜色 <BR>setForeground(Color c) 设置字体颜色 <BR><BR><BR>第十三章 选择框 <BR><BR>1、选择框 <BR>Checkbox() 构造选择框 <BR>Checkbox(String s) 构造选择框，给定标题s <BR>Checkbox(String s,boolean b) b设定初始状态 <BR>Checkbox(String s,boolean b,CheckboxGroup g) g设定了所属的组（有了组就成为单选框） <BR>addItemListener() 添加监视器 <BR>removeItemListener() 移去监视器 <BR>getState() 返回选择框的是否选中状态 <BR>setState(boolean b) 设置选择框的状态 <BR>getLabel() 获取选择框的标题 <BR>setLabel(String s) 设置选择框的标题为s <BR><BR>第十四章 选择控件和滚动列表 <BR><BR>1、选择控件 <BR>Choice() 构造选择控件 <BR>add(String s) 向选择控件增加一个选项 <BR>addItemListener() 添加监视器 <BR>removeItemListener() 移去监视器 <BR>getSelectedIndex() 返回当前选项的索引 <BR>getSelectedItem() 返回当前选项的字符串代表 <BR>insert(String s,int n) 在n处插入选项s <BR>remove(int n) <BR>removeAll() <BR>2、滚动列表 <BR>List() 构造滚动列表 <BR>List(int n) 参数n是可见行数 <BR>List(int n,boolean b) 参数b是设置是否可以多项选择 <BR>add(String s) 向列表的结尾增加一个选项 <BR>add(String s,int n) 在n处增加一个选项 <BR>AddActionListener() 滚动列表添加监视器 <BR>addItemListener() 滚动列表上的选项添加监视器 <BR>remove(int n) 删除n初的选项 <BR>remnoveAll() 删除全部选项 <BR>getSelectedIndex() 返回当前选项的索引 <BR>getSelectedItem() 返回当前选项的字符串代表 <BR><BR><BR>3、组件类的一些常用方法 <BR>void setBackground(Color c) 设置组件背景颜色 <BR>void setForeground(Color c) 设置组件前景颜色 <BR>void setFonts(Font f) 设置组件字体 <BR>void setBounds(int x,int y,int w,int h) 设置坐标，x，y表示在容器中坐标，w,h表示宽和高 <BR>void setLocation(int x,int y) 移动到x，y 处 <BR>void setSize(int w,int h) 设置宽和高 <BR>void setVisible(boolean b) 设置组建是否可见 <BR>int getBounds().wigth 获取宽 <BR>int getBounds().height 获取高 <BR>int getBounds().x 获取x 坐标 <BR>int getBounds().y 获取y 坐标 <BR>Toolkit getToolkit() 获取工具包对 <BR>void setEnabled(boolean b) 设置是否可以使用（默认可以） <BR><BR>第十五章 窗口和菜单 <BR>1、窗口 <BR>Frame() 构造窗口 <BR>Frame(String s) 窗口标题是s <BR>setBounds(int x,int y,int w,int h) 窗口位置x，y，宽w,高y <BR>setSize(int w,int h) 设置窗口位置（单位是像素） <BR>setBackground(Color c) 设置背景颜色 <BR>setVisible(boolean b) 设置窗口是否可见 <BR>pack() 窗口出现时紧凑 <BR>setTitle(String s) 设置标题为s <BR>getTitle() 获取标题 <BR>setResizable(boolean b) 设置窗口大小是否可以调整 <BR>2、菜单条 <BR>Menubar() 构造菜单条 <BR>setMenubar() 窗口添加菜单条 <BR>3、菜单 <BR>Menu() 构造菜单 <BR>Menu(String s) 构造菜单，标题s <BR>add<BR>add(MenuItem item) 菜单增加菜单选项item <BR>add(String s) 向菜单增加选项s <BR>getItem(int n) 获取n处的选项 <BR>getItemCount() 获取选项数目 <BR>insert(MenuItem item,int n) 在n处插入菜单选项item <BR>insert(String s,int n) 在n处插入菜单选项 <BR>remove(int n) 删除菜单的n处的菜单选项 <BR>removeAll() 删除全部 <BR>4、菜单项 <BR>MenuItem() 构造菜单项 <BR>MenuItem(String s) 构造标题是s的菜单项 <BR>setEnabled(boolean b) 设置是否可以被选择 <BR>getLabel() 得到菜单选项名 <BR>addActionListener() 添加监视器 <BR>5、有关菜单的技巧 <BR>addSeparator() 增加菜单分割线 <BR>CheckboxMenuItem() 复选框菜单项 <BR>setShortcut(MenuShortcut k) 设置快捷键(k取值KeyEvent.VK_A----KeyEvent.VK_Z) <img src ="http://www.cnitblog.com/sunyan/aggbug/4531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunyan/" target="_blank">孙 岩</a> 2005-11-15 13:00 <a href="http://www.cnitblog.com/sunyan/articles/4531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用java编写简单UDP网络通信程序</title><link>http://www.cnitblog.com/sunyan/articles/4529.html</link><dc:creator>孙 岩</dc:creator><author>孙 岩</author><pubDate>Tue, 15 Nov 2005 04:37:00 GMT</pubDate><guid>http://www.cnitblog.com/sunyan/articles/4529.html</guid><wfw:comment>http://www.cnitblog.com/sunyan/comments/4529.html</wfw:comment><comments>http://www.cnitblog.com/sunyan/articles/4529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunyan/comments/commentRss/4529.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunyan/services/trackbacks/4529.html</trackback:ping><description><![CDATA[<SPAN id=LblContent>作者： <A id=HyperAuthor href="http://kb.csdn.net/ArticleAuthor.aspx?author="></A>∣来源：<A id=HyFromWhere href="http://www.javaresearch.org/article/" target=_blank>JavaResearch</A>∣<A id=HyHistoryUrl title=http://www.javaresearch.org/article/showarticle.jsp?column=291&amp;thread=32347 href="http://www.javaresearch.org/article/showarticle.jsp?column=291&amp;thread=32347" target=_blank>原文地址</A>∣<SPAN id=LblUpdateDate>2005-7-19</SPAN> <BR><BR>java中封装了大量的socket&nbsp;API,为编写网络通信程序提供了极大的方便.<BR>在计算机网络的学习中,大家都已熟练掌握了TCP/UDP的基本原理,在此不在赘述.仅给出接收端和发送端的源代码,供大家讨论和批评.<BR>发送端代码如下:<BR>//只要稍加改进,即可发送数据<BR>import&nbsp;java.io.*;<BR>import&nbsp;java.lang.*;<BR>import&nbsp;java.net.*;<BR>public&nbsp;class&nbsp;uclient<BR>{<BR>&nbsp;private&nbsp;DatagramSocket&nbsp;cli;<BR>&nbsp;private&nbsp;DatagramPacket&nbsp;pac;<BR>&nbsp;private&nbsp;byte&nbsp;sb[];<BR>&nbsp;private&nbsp;String&nbsp;sen;<BR>&nbsp;public&nbsp;uclient()<BR>&nbsp;{<BR>&nbsp;&nbsp;Init();<BR>&nbsp;}<BR>&nbsp;public&nbsp;void&nbsp;Init()<BR>&nbsp;{<BR>&nbsp;&nbsp;try<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;//指定端口号，避免与其他应用程序发生冲突<BR>&nbsp;&nbsp;&nbsp;cli=new&nbsp;DatagramSocket(10002);<BR>&nbsp;&nbsp;&nbsp;sb=new&nbsp;byte[1024];<BR>&nbsp;&nbsp;&nbsp;sen="UDP方式发送数据";<BR>&nbsp;&nbsp;&nbsp;sb=sen.getBytes();<BR>&nbsp;&nbsp;&nbsp;pac=new&nbsp;DatagramPacket(sb,sb.length,InetAddress.getByName("localhost"),10005);<BR>&nbsp;&nbsp;&nbsp;cli.send(pac);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;catch(SocketException&nbsp;se)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;se.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;catch(IOException&nbsp;ie)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ie.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])<BR>&nbsp;{<BR>&nbsp;&nbsp;new&nbsp;uclient();<BR>&nbsp;}<BR>}<BR>接收端数据:<BR>//加以改进代码,可以改变接收方式<BR>import&nbsp;java.io.*;<BR>import&nbsp;java.lang.*;<BR>import&nbsp;java.net.*;<BR>public&nbsp;class&nbsp;userve<BR>{<BR>&nbsp;private&nbsp;DatagramSocket&nbsp;ser;<BR>&nbsp;private&nbsp;DatagramPacket&nbsp;pac;<BR>&nbsp;private&nbsp;byte&nbsp;rb[];<BR>&nbsp;private&nbsp;String&nbsp;rev;<BR>&nbsp;public&nbsp;userve()<BR>&nbsp;{<BR>&nbsp;&nbsp;&nbsp;Init();<BR>&nbsp;}<BR>&nbsp;public&nbsp;void&nbsp;Init()<BR>&nbsp;{<BR>&nbsp;&nbsp;try<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;ser=new&nbsp;DatagramSocket(10005);<BR>&nbsp;&nbsp;&nbsp;rb=new&nbsp;byte[1024];<BR>&nbsp;&nbsp;&nbsp;pac=new&nbsp;DatagramPacket(rb,rb.length);<BR>&nbsp;&nbsp;&nbsp;rev="";<BR>&nbsp;&nbsp;&nbsp;int&nbsp;i=0;<BR>&nbsp;&nbsp;&nbsp;while(i==0)//无数据，则循环<BR>&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ser.receive(pac);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=pac.getLength();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i&gt;0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//指定接收到数据的长度,可使接收数据正常显示,开始时很容易忽略这一点<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rev=new&nbsp;String(rb,0,pac.getLength());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(rev);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=0;//循环接收<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;catch(Exception&nbsp;e)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])<BR>&nbsp;{<BR>&nbsp;&nbsp;&nbsp;new&nbsp;userve();<BR>&nbsp;}<BR>}<BR></SPAN><img src ="http://www.cnitblog.com/sunyan/aggbug/4529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunyan/" target="_blank">孙 岩</a> 2005-11-15 12:37 <a href="http://www.cnitblog.com/sunyan/articles/4529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个关于JAVA绘制仿真立体饼图的程序源码</title><link>http://www.cnitblog.com/sunyan/articles/4337.html</link><dc:creator>孙 岩</dc:creator><author>孙 岩</author><pubDate>Fri, 11 Nov 2005 06:57:00 GMT</pubDate><guid>http://www.cnitblog.com/sunyan/articles/4337.html</guid><wfw:comment>http://www.cnitblog.com/sunyan/comments/4337.html</wfw:comment><comments>http://www.cnitblog.com/sunyan/articles/4337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/sunyan/comments/commentRss/4337.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/sunyan/services/trackbacks/4337.html</trackback:ping><description><![CDATA[<TABLE class=center_tdbgall style="WORD-BREAK: break-all" cellSpacing=0 cellPadding=0 width=776 align=center border=0>
<TBODY>
<TR vAlign=center align=middle>
<TD class=main_ArticleTitle style="WORD-BREAK: break-all" colSpan=2 height=50>一个关于JAVA绘制仿真立体饼图的程序源码</TD></TR>
<TR vAlign=center align=middle>
<TD class=main_ArticleSubheading style="WORD-BREAK: break-all" colSpan=2></TD></TR>
<TR align=middle>
<TD class=Article_tdbgall colSpan=2>作者：佚名&nbsp;&nbsp;&nbsp;&nbsp;文章来源：转载&nbsp;&nbsp;&nbsp;&nbsp;点击数：
<SCRIPT language=javascript src="/Article/GetHits.asp?ArticleID=693"></SCRIPT>
 8&nbsp;&nbsp;&nbsp;&nbsp;更新时间：2005-10-29 <A title=收藏的网页将被永久地保存到新浪ViVi收藏夹http://vivi.sina.com.cn href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(vivi=window.open('http://vivi.sina.com.cn/collect/icollect.php?pid=2008&amp;title='+escape(d.title)+'&amp;url='+escape(d.location.href)+'&amp;desc='+escape(t),'vivi','scrollbars=no,width=480,height=480,left=75,top=20,status=no,resizable=yes'));vivi.focus();"><IMG src="http://www.now91.net/images/vivi_coop1.gif" align=absMiddle border=0></A></TD></TR>
<TR>
<TD class=main_tdbg_760 id=fontzoom style="WORD-BREAK: break-all" vAlign=top colSpan=2 height=300>
<TABLE cellSpacing=0 cellPadding=10 align=left border=0>
<TBODY>
<TR>
<TD><!--插入广告JS代码--></TD></TR></TBODY></TABLE>
<DIV class=ContentFont id=NewaspContentLabel style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px"><FONT id=font_word style="FONT-SIZE: 14px; FONT-FAMILY: 宋体, Verdana, Arial, Helvetica, sans-serif">下面程序是一个APPLET,有兴趣的朋友可以将其改为BEAN,<BR>/程序名称:饼形图 <BR>//程序类型:JAVA APPLET <BR>//文件类型:模板文件,由HTML驱动,数据为模拟数据 <BR>//原文件名:CakeChart.java <BR>//程序版本:1.5 <BR>//程序设计人:杨勇 <BR>//更新日期:2003-3-13 <BR>import java.awt.*; <BR>import javax.swing.*; <BR>import java.awt.event.*; <BR>import java.math.*; <BR>import java.util.*; <BR>import java.awt.geom.Arc2D; <BR>import java.awt.geom.*; <BR>import java.awt.Polygon; <BR>import java.util.Date; <BR>import java.applet.*; <BR><BR>public class CakeChart extends Applet <BR>{ <BR>//初始数据 <BR>private double data[]={100.,50,113.,127.,299.234,120.,93.,123.,127.,199.,157.,189.}; <BR>private String percent[]=new String[data.length]; //每个数据所占百分比 <BR>private int radian[]=new int[data.length]; //每个数据所对应的弧度数 <BR>private double max,min; <BR>//初始化每块饼的颜色 <BR>private int dia=240;//设置饼图透明度 <BR>private Color c1=new Color(0,255,0,dia); <BR>private Color c2=new Color(255,255,0,dia); <BR>private Color c3=new Color(255,0,0,dia); <BR>private Color c4=new Color(255,128,64,dia); <BR>private Color c5=new Color(255,128,255,dia); <BR>private Color c6=new Color(255,0,128,dia); <BR>private Color c7=new Color(233,124,24,dia); <BR>private Color c8=new Color(204,119,115,dia); <BR>private Color c9=new Color(89,159,230,dia); <BR>private Color c10=new Color(148,140,179,dia); <BR>private Color c11=new Color(128,0,64,dia); <BR>private Color c12=new Color(174,197,208,dia); <BR>private Color colors[]={c1,c2,c3,c12,c11,c6,c4,c8,c9,c10,c5,c7}; <BR>//统计图的宽度和高度 <BR>private int width=600; <BR>private int height=400; <BR>//定义标题起始坐标变量 <BR>private int titleStart_x; <BR>private int titleStart_y; <BR>//定义圆心坐标 <BR>private int oval_x=60; <BR>private int oval_y=90; <BR>//定义椭圆的长轴和短轴 <BR>private int long_axes=280; <BR>private int short_axes=200; <BR>//定义图例区域起点坐标 <BR>private int cutlineRect_x=70; <BR>private int cutlineRect_y=450; <BR>//定义图倒区域矩形的宽度和高度 <BR>private int cutlineRect_width=100; <BR>private int cutlineRect_heigth=235; <BR>//定义日期变量 <BR>private Date date=new Date(); <BR>//定义统计图其他显示信息的超始坐标 <BR>private int otherInfo_x1; <BR>private int otherInfo_y1; <BR>private int otherInfo_x2; <BR>private int otherInfo_y2; <BR>private int otherInfo_x3; <BR>private int otherInfo_y3; <BR>//定义标题\X\Y轴信息 <BR>private String title="服务器流量统计 (饼形统计图) "; <BR>private String otherInfo1="西南师范大学网络教育学院"; <BR>private String otherInfo2="www.eduwest.com"; <BR>private String otherInfo3="绘图日期："; <BR>//双缓冲设置 <BR>private Image offScreenImage =null; <BR>private Graphics offScreenBuffer =null; <BR><BR>public CakeChart() <BR>{ <BR>} <BR>public void init() <BR>{ <BR>offScreenImage=this.createImage(width,height); <BR>offScreenBuffer=offScreenImage.getGraphics(); <BR>NumberBudget(); <BR>CoorBudget(); <BR>} <BR><BR>public void NumberBudget() <BR>{ <BR><BR>//求数据中的最大值和最小值 <BR>max=data[0]; <BR>min=data[0]; <BR>for(int mm=0;mm&lt;data.length;mm++) <BR>{ <BR>if(data[mm]&gt;max) <BR>max=data[mm]; <BR>if(data[mm]&lt;min) <BR>min=data[mm]; <BR>} <BR>//对数据进行求和运算 <BR>float allData_sum=0; <BR>for(int s=0;s&lt;data.length;s++) <BR>{ <BR>allData_sum+=data[s]; <BR>} <BR>//计算每个数据占总数的百分比 <BR>for(int p=0;p&lt;data.length;p++) <BR>{ <BR>percent[p]=String.valueOf(Math.round(data[p]/allData_sum*100))+"%"; <BR>} <BR><BR>//计算每个数据所对应的弧度数 <BR>for(int r=0;r&lt;data.length;r++) <BR>{ <BR>radian[r]=Math.round((float)data[r]/allData_sum*360); <BR>} <BR>} <BR><BR>public void CoorBudget() <BR>{ <BR>//预算标题信息的起始坐标 <BR>titleStart_x=22; <BR>titleStart_y=(width/2)-(title.length()*15/2); <BR>//初始化统计图其他显示信息的起始坐标(位置固定) <BR>otherInfo_x1=390; <BR>otherInfo_y1=450; <BR>otherInfo_x2=400; <BR>otherInfo_y2=480; <BR>otherInfo_x3=390; <BR>otherInfo_y3=5; <BR>} <BR><BR>public void update(Graphics g) <BR>{ <BR>paint(g); <BR>} <BR><BR>public void paint(Graphics g) <BR>{ <BR>PaintBackground(offScreenBuffer); <BR>PaintChart(offScreenBuffer); <BR>g.drawImage(offScreenImage,0,0,this); <BR>} <BR><BR>public void PaintBackground(Graphics g) <BR>{ <BR>//渐变背景初始颜色 <BR>Color BackStartColor=Color.white; <BR>Color BackLastColor=new Color(162,189,230); <BR>Color titleColor=Color.black; <BR>Color otherInfoColor=new Color(41,78,118); <BR>//标题背景颜色 <BR>Color titleBackColor=new Color(147,179,225); <BR>//统计图中心区域颜色 <BR>Color cutlineColor=new Color(0,128,255,50); <BR>//图例数据颜色 <BR>Color cutDataColor=Color.white; <BR><BR>Font titleFont=new Font("黑体",Font.BOLD,18); <BR>Font otherFont=new Font("宋体",Font.PLAIN,12); <BR>String year=""; <BR>String month=""; <BR>String day=""; <BR>Graphics2D g2=(Graphics2D)g; <BR>RenderingHints hints = new RenderingHints(null); <BR>hints.put(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); <BR>g2.setRenderingHints(hints); <BR><BR>GradientPaint gradient=new GradientPaint(0,0,BackStartColor,0,400,BackLastColor,false); <BR>g2.setPaint(gradient); <BR>Rectangle2D rect=new Rectangle2D.Double(0,0,width,height); <BR>g2.fill(rect); <BR>//绘制标题背景 <BR>g2.setColor(titleBackColor); <BR>g2.fill3DRect(0,0,width,30,true); <BR>//绘制图例区域背景 <BR>g2.setColor(cutlineColor); <BR>g2.fillRect(cutlineRect_y,cutlineRect_x,cutlineRect_width,cutlineRect_heigth); <BR>g2.setColor(Color.white); <BR>g2.drawRect(cutlineRect_y,cutlineRect_x,cutlineRect_width,cutlineRect_heigth); <BR>//绘制统计图标题 <BR>g2.setFont(titleFont); <BR>g2.setColor(titleColor); <BR>g2.drawString(title,titleStart_y,titleStart_x); <BR>//显示统计图其它信息 <BR>g2.setFont(otherFont); <BR>g2.setColor(otherInfoColor); <BR>g2.drawString(otherInfo1,otherInfo_y1,otherInfo_x1); <BR>g2.drawString(otherInfo2,otherInfo_y2,otherInfo_x2); <BR>g2.drawString(otherInfo3,otherInfo_y3,otherInfo_x3); <BR>//显示绘制日期 <BR>year=Integer.toString(1900+date.getYear()); <BR>month=Integer.toString(date.getMonth()+1); <BR>day=Integer.toString(date.getDate()); <BR>g2.drawString(year+"年"+month+"月"+day+"日",otherInfo_y3+60,otherInfo_x3); <BR>//显示数据百分比 <BR>int colorRectWH=15; <BR>int space=5; //图例中小色块之间的间隔距离 <BR>int addData=cutlineRect_x; <BR>for(int i=0;i&lt;data.length;i++) <BR>{ <BR>g2.setColor(colors[i]); <BR>g2.fill3DRect(cutlineRect_y,addData,colorRectWH,colorRectWH,true); <BR>if(data[i]==max || data[i]==min) <BR>g2.setColor(Color.red); <BR>else <BR>g2.setColor(cutDataColor); <BR>g2.drawString(String.valueOf(data[i])+" ("+percent[i]+")",cutlineRect_y+20,addData+colorRectWH-space); <BR>addData+=colorRectWH+space; <BR>} <BR>} <BR><BR>public void PaintChart(Graphics g) <BR>{ <BR>int start=0; <BR>int rVal=192; <BR>int gVal=192; <BR>int bVal=192; <BR>int frameCount=60; <BR>Graphics2D g2=(Graphics2D)g; <BR>RenderingHints hints = new RenderingHints(null); <BR>hints.put(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); <BR>g2.setRenderingHints(hints); <BR><BR>for(int t=20;t&gt;=0;t--) <BR>{ <BR>rVal=t*255/frameCount; <BR>gVal=t*255/frameCount; <BR>bVal=t*255/frameCount; <BR>g2.setColor(new Color(rVal,gVal,bVal,50)); <BR>g2.drawOval(oval_x,oval_y+t,long_axes,short_axes); <BR>} <BR>for(int a=0;a&lt;data.length;a++) <BR>{ <BR>Arc2D arc = new Arc2D.Float(Arc2D.PIE); <BR>g2.setColor(colors[a]); <BR>arc.setFrame(oval_x,oval_y,long_axes,short_axes); <BR>arc.setAngleStart(start); <BR>arc.setAngleExtent(radian[a]); <BR>g2.fill(arc); <BR>if(data[a]==max || data[a]==min) <BR>g2.setColor(Color.white); <BR>else <BR>g2.setColor(new Color(223,223,223,150)); <BR>g2.draw(arc); <BR>start+=radian[a]; <BR>} <BR><BR>} <BR>HTML程序: <BR>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <BR>&lt;HTML&gt; <BR>&lt;HEAD&gt; <BR>&lt;TITLE&gt; New Document &lt;/TITLE&gt; <BR>&lt;META NAME="Generator" CONTENT="EditPlus"&gt; <BR>&lt;META NAME="Author" CONTENT=""&gt; <BR>&lt;META NAME="Keywords" CONTENT=""&gt; <BR>&lt;META NAME="Description" CONTENT=""&gt; <BR>&lt;/HEAD&gt; <BR><BR>&lt;BODY&gt; <BR>&lt;APPLET CODE="CakeChart.class" WIDTH="600" HEIGHT="400"&gt; <BR>&lt;/APPLET&gt; <BR>&lt;/BODY&gt; <BR>&lt;/HTML&gt; <BR><BR>============================== <BR>说明: <BR>必须将HTML和CLASS放在一个目录里,必须安装JRE(1.4及以上版本). <BR>============================== <BR>国外也有类似API包,有免费的也有收费的, <BR>比如 :http://www.visualmining.com (商业的,不过可以学习其系统架构,很不错) <BR>http://www.jfree.org/ (免费的,不过API文档要收费) <BR>-------------------------------- <BR></FONT></DIV></TD></TR></TBODY></TABLE><img src ="http://www.cnitblog.com/sunyan/aggbug/4337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sunyan/" target="_blank">孙 岩</a> 2005-11-11 14:57 <a href="http://www.cnitblog.com/sunyan/articles/4337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>