rex mao -凯发k8网页登录

分享java技术与生活

2008年5月24日

由于留言的提示邮件会被标记为垃圾邮件, 所以很多留言我没能发现并回复。
如果有问题要讨论,请大家直接发邮件到邮箱。

另外,如果需要源程序,可联系购买,也可提供程序扩展开发。

谢谢。

posted @ rex mao|  

2008年5月17日


1. 显示当前连接。

sql:
        select *                                                                                                                                                 
        from v$session                                                                                                                                 
        where status = 'inactive'                                                                                                             
        and username is not null;                                                                                                         


2. 强制关闭用户的连接

sql:
    a) select username, sid, serial#                                                                                                   
        from v$session                                                                                                                                 
        where status = 'inactive'                                                                                                             
        and username is not null;                                                                                                         
                                                                                                                                                                          
    b) alter system kill session 'sid, serial#'; --sid 和 serial#是在步骤a)中得到的结果。


3. 从返回的结果中选择第m到n条记录

sql:
        select *                                                                                                                                                   
        from (                                                                                                                                                      
                     select a.*, rownum rn                                                                                                       
                     from (                                                                                                                                         
                                   select *                                                                                                                        
                                   from yourtable --这里请用你的select语句代替                                            
                                  ) a                                                                                                                                     
                     where rownum <= n                                                                                                              
                     )                                                                                                                                                      
        where rn >= m;                                                                                                                                      
    
4. 重新编译包 (package) 和 包体 (package body)
    此命令可以用于查看在sqlplus中创建的package的编译错误。

sql:
        a) 编译 package
            alter package your_package                                                                                                 
            compile specification;                                                                                                                
        b) 编译 package body

            alter package your_package                                                                                                 
            compile body;                                                                                                                                   

        c) 查看错误
            show err;                                                                                                                                             

5. 解除锁定的用户

sql:
sql:
    alert user username unlock;


 

posted @ rex mao 阅读(3098) | |  

2007年11月3日

这个是我做的另一个毕业设计,使用的最基本的socket通信实现文件传输,使用该程序可同时给多个人发送不同的文件并支持断点续传。
由于只为毕业设计而写的,只实现了功能,没有在速度上优化,发上来只为给要做类似程序的朋友做个参考。以下是毕业论文中的节选。

源代码已经上传了。

3章      设计文档

31       任务概述

       本项任务要开发一款p2p文件传输软件,该软件可以在局域网和互连上使用,具有文件传输,断点续传,多线程连接等功能。

311      开发背景

       随着网络的普及,在网络中交换信息,特别是文件成为使用网络时经常性工作,现有的文件传输工具如qqmsn等,主要功能是作为即时通讯工具使用,而且在局域网中使用时仍需连接到互连网。本文开发的软件基于p2p结构实现文件传输,不依靠服务器维护用户资料,所以,只要两台机器可以连通,就可以进行文件传输。

312       定义

       p2p:即peer-to-peer,可以理解为点对点,或对等传输的意思。

313       开发工具

       开发采用java语言,开发工具为jbuilder 2005

32       文件传输业务流程

321       通讯顺序关系

       在文件传输时,传输过程可以简单的分为4步,如图

1、              由文件发送者发起文件传输,他首先发送文件名,文件大小,验证消息等信息给文件接收者。

2、              文件接收者收到文件信息和发送者信息,决定是否接收,如不接收,则发送拒绝接收消息给文件发送者,文件传输结束。如同意接收,发送同意接收消息和文件传输起始字节(用于断点续传)给发送者。

3、              发送者开始发送文件数据包,直到最后一个文件数据包,发送者在最后一个文件数据包上加上标记。

4、              接收者识别最后一个文件数据包,文件传输成功。


322       文件发送端的详细业务流程


 

图中显示了发送文件时的详细业务流程。

1、首先,要选择要发送的文件,可以选择一个文件或同一个文件夹下的多个文件发送,当选择多个文件时,软件将为每个文件建立一个传输线程。选择文件后,发送者要填写目标ip和端口,由于是基于p2p的文件传输,不存在服务器维护好友列表,所以需要知道目标ip才能传输文件,用户也可以填写验证消息用于描述自己的身份和文件的介绍。

2、发送者收到确认包,判断是否接收文件,如果不接收,则传输结束,如果接收,则打开要发送的文件,设置起始传输字节。

3、发送者读取一个文件片段,加入是否是最后一个文件片段的标志,打包发给接收者。

4、发送完最后一个文件片段时,文件传输结束。

323       文件接收者详细业务流程


 

1、 从一打开软件开始,监听线程就会启动,这时用户就扮演者文件接收者的角色,当有文件发送者发来请求时,监听线程建立与发送者的连接,并创建传输线程,接收者得到发送者传来的文件信息和验证消息,用户还能得到发送者的ip地址,用户根据这些信息决定是否接收文件,并发送确认包给发送者,确认包里包含了是否接收的标志,和开始传输的起始字节。

2、 接收者开始接收数据包,解包,写入文件中,直到最后一个文件片段,关闭文件,文件传输结束。

33       软件的传输协议设计

       为了更好的控制文件传输的流程,开发设计了文件传输协议,该协议属于应用层协议,为了不使传输过程过于复杂,协议尽量简单设计。主要的内容是传输包的格式。

331       传输包的格式


 

其中传输包的类型有3种:

package_type_filename = 0x01

文件名包,该包用于文件发送者向接收者发送文件信息和验证消息

package_type_context = 0x02

文件内容包,该包用于传输文件内容

package_type_confirmreceive = 0x03

文件传输确认包,该包用于文件接收者向发送者确认文件的接收

332       文件名包格式


 

333      文件传输包格式

 

其中more_data用于确认是否是文件片段的最后一个包,以结束文件的传输。0表示没有数据,1表示还有数据。

3. 34      文件接受确认包格式


 

其中confirm_flag表示是否确认文件接收,1表示接收,0表示不接收,当接收时,off表示文件传输的起始字节,用来实现断点续传。

3.4       文件传输的状态机

文件传输线程的地层其实就是一个状态转换机,线程具有几个状态,线程从文件名传输状态开始,根据文件传输的不同情况,在各个状态间转换,直到传输成功或传输失败。

file_trans_status_filename = 0x01

文件名称传输状态,文件传输刚建立连接时,传输状态处于文件名传输状态

file_trans_status_context = 0x02

文件内容传输转台,在传输文件内容时,传输状态属于该状态

file_trans_status_waitforconfirm = 0x03

等待确认状态,文件发送者,发送完文件信息和验证消息后,处于该状态,文件接收者接收到文件信息和验证消息后处于该状态

file_trans_status_success = 0x04

文件传输成功状态,表示文件已成功传输完毕

file_trans_status_fail = 0x05

文件传输失败状态,表示文件传输已经失败,失败原因可能是对方取消了文件传输或网络错误




 

3.5        结构设计

软件主要由mainframe,transfilemanager,socketthread,server,transfilepanel五个类构成图 表示了这几个类之间的关系。


 

类功能介绍

mainframe

mainframe类是软件的主界面类,负责与用户的交互。

transfilemanager

transfilemanager类是文件传输的控制类,负责管理文件的传输,它维护一个传输线程(socketthread)的列表,每个线程都表示一个正在传输的任务。transfilemanager类定时的扫描各个线程的状态,根据不同状态做出不同处理,如计算传输速度,显示传输进度等。

socketthread

socketthread类是文件传输线程类,它负责底层的具体传输工作,包括打包与解包,并且转换自己的状态,完成文件的传输。

server

server类是为transfilemanager类使用的,它负责本地端口的监听,一旦有用户连接,transfilemanager就创建一个传输线程,放入线程列表。而它继续监听端口。

transfilepanel

transfilepanel是一个面板,它用有按钮、进度条,标签等用来显示文件的传输状态。

3.6        类设计

361       mainframe

该类是视图类,是软件的主界面。

 

成员变量:

contentpane

contentpanejpanel类的对象,是主界面的面板。

jbtnsend

jbtnsendjbutton类对象,点击它将打开文件传输对话框。

jbtnsetting

jbtnsettingjbutton类对象,点击它将打开设置对话框。

jlblip

jlblipjlable类对象,它显示本机的ip地址,方便文件的传输。

jtptransfile

jtptransfilejtabbedpane类对象,是选项卡控件,用于显示多个文件同时传输。

tfm

tfmtransfilemanager类对象,负责控制文件的传输。

成员方法:

jbtnsend_anctionperformed()

该方法为jbtnsend按钮的点击事件

jbtnsetting_actionperformed()

该方法为jbtnsetting按钮的点击事件

this_windowclosed()

该方法为窗口关闭事件

界面截图:


 

362       transfilemanager

该类负责传输过程中对各个传输线程的检测与控制。


 

成员变量:

jtp

jtp是选项卡控件对象,是mainframe类中jtptransfile对象的一个引用。

panelist

panelistarraylist类对象,它是一个链表结构,存储使用的选项卡。

running

running是一个boolean型的对象,用来表示线程是否在执行。

s

sserver类的对象,用来坚听本地端口,等待用户的连接。

threadlist

threadlistarraylist类对象,它是一个链表结构,存储使用的传输线程。

maxthreadnum

maxtreadnum是整型变量,表示最大允许的线程数。

port

port是整型变量,表示使用的端口号。

成员方法:

close()

该方法用于关闭文件传输的控制。

sendfile()

该方法用于建立一个文件发送,要求输入参数为,目标ip,端口号,要发送的文件和验证消息。

3.6.3           socketthread

socketthread类是文件传输的底层支持类,它提供文件传输的服务。


 

成员变量:

sendbuf

sendbuf是一个字节型数据,它是文件发送和接收时的缓冲区。

dis

disdatainputstream型对象,它是由socket对象得到的输入流。

dos

dosdataoutputstream型对象,它是由socket对象得到的输出流。

fdis

fdisdatainputstream型对象,它是要发送的文件的输入流。

raf

rafrandomaccessfile型对象,该对象允许设置输出流的位置,以支持断点续传。

running

running是一个boolean型对象,用来表示线程是否在执行。

servername

servername是字符串型对象,表示服务器的地址,该对象只有在线程作为发送者时使用。

errormessage

errormessage是字符串型对象,表示出错的信息。

filename

filename是字符串型对象,表示文件名。

filesender

filesender是一个boolean型对象,表示是文件发送者还是文件接收者。

ip

ip是字符串型对象,用来存放目的机的ip地址。

message

message是字符串型对象,用来表示验证信息。

port

port是整型变量,表示连接的端口号。

transfilelength

transfilelength是长整型变量,表示已经传输的文件长度,transfilemanager可以用它来计算传输进度和传输速度

成员方法:

canceltrans()

该方法用于取消传输

confirmreceivefile()

该方法用于确认传输文件

参数flag用来表示是否同意传输

参数filename用来表示保存的文件

参数off用来表示起始传输字节

getfiletransmessage()

该方法用于得到文件传输的基本信息。如:文件发送的目标,端口号等。

getstatus()

该方法返回一个整型变量,表示当前线程的传输状态。

run()

线程的执行方法,该方法中循环执行发送或接收方法,完成文件的发送或接收。

seterror()

该方法通过一个字符串型的参数设置错误信息。

stopthread()

该方法用于停止线程的执行。

dopackage()

打包方法,该方法中,根据线程所处的不同状态,对数据加入不同的包头和其他信息,进行打包。

readfromfile()

该方法从要发送的文件中读取一个整型数。

readfromsocket()

该方法从socket输入流读取一个整型数,它有一个重载版本读取一个字节数组的数据。

receivefile()

该方法为接收文件的方法,是线程循环中,文件接收者执行的方法。

sendfile()

该方法为发送文件方法,是线程循环中,文件发送者执行的方法。

writetofile()

该方法写一个字节数据的数据到保存的文件中。

writetosocket()

该方法写数据到socket输出流中,它有三个重载版本,分别是写入整型数,写入长整型数和写入字节数组数据。

3.6.3            transfilepanel

这个类属于视图类,它作为主界面上的一个对象使用,含有进度条,按钮,标签的对象,用于显示文件传输状态,每一个传输线程都拥有自己的transfilepanel类对象。


 

成员变量:

filename

filename是一个字符串,表示传输文件的文件名。

filesender

filesenderboolean型对象,表示是文件发送者还是接收者。

iscanneled

iscanneledboolean型对象,传输过程中,用户点了取消按钮后,该标志位置truetransfilemanager会循环检测iscanneled标志,当发现其为true后,它会关闭对应的传输线程,而对方会检测到传输错误,文件传输就停止了。

isclosed

isclosedboolean型对象,它表示当传输过程已经停止时,用户点击了关闭按钮,transfilemanager检测到isclosedtrue时,会在列表中去掉对应的传输线程和transfilepanel

isconfirm

isconfirmboolean型对象,它表示文件接收者是否确认了文件接收后(包括同意和拒绝),transfilemanager检测到isconfirmtrue时,会将确认状态发给文件发送者。

jbtncannel

jbtncannel是取消按钮。

jbtnok

jbtnok是确定按钮。

jpgbfiletrans

jpgbfiletrans是文件传输的进度条。

jtafiletransstatus

jtafiletransstatus是一个文本框,用来显示文件传输的状态。

transfilelength

transfilelength是一个长整型变量,用来表示已经传输的文件长度。

status

status是一个整行变量,表示文件传输的状态,所表示的状态与socketthread中的对应。

界面截图


 

3.7              算法介绍

371 transfilemanager的循环监听

transfilemanger类继承了thread类,实现多线程,避免循环监听时产生阻塞。

以下是在每次循环中做的工作

1、 得到传输线程(socketthread)的数量和传输状态显示面板(transfilepanel)的数量。

2、 从传输线程列表中依次取出一个传输线程。

3、 判断当前取出的线程是否有对应的传输状态显示面板,如果有执行5,如果没有执行4

4、 增加传输状态显示面板,并且在主界面上增加选项卡。

5、 判断传输线程的状态,根据不同的状态做不同的处理。

6、 如果列表中的线程取完,执行1,没有取完执行2

程序流程图:



 

372 断点续传

软件支持断点续传的功能,该功能主要算法如下:

1、 当文件传输中途停止时,文件接收者程序为接收的文件创建一个以该文件名 .tmp为文件名的临时文件,临时文件与该文件保存在同一个路径下。临时文件中保存文件以传输的字节数和文件的大小。

2、 当文件接收者接收该文件时,如果有对应的临时文件,程序会检测到该文件的临时文件,读取以传输的字节数和文件大小,并且比较传输的字节数与未完成传输的文件大小是否相等,文件大小和发送来的文件大小是否相等,如果都相等,执行3,否则执行4

3、 将文件的输出流设置到应该继续传输的位置,并将起始传输字节数发给发送者,执行5

4、 如果有未完成的传输文件,将其删除,执行5

5、 进行文件传输。

程序流程图:




 

3.7.3            本地端口的多连接监听

server类对象负责本地端口的监听,可以支持多了连接,具体数量由用户设置。

1、  用用户设置的端口创建监听,等待连接。

2、  当有用户连接上后,用该连接创建一个socketthread传输线程,加入到线程列表。

3、  如果停止监听则退出,否则执行1

程序流程图:

posted @ rex mao 阅读(13548) | |  

2007年7月21日


      经过毕业后的休息,来到上海已经快一个星期了,总体感觉一般,城市没有传说中那么现代,路上一样有小广告,一样有人不走人行横道,一样有破破的楼房,地铁站外一样有黑车拉客。昨天去了外滩,才看到几处高楼,不过怎么看也没有电视上放的那样有气势。南京路上老外还是比较多(老外的眼神很迷茫)。
      周一就要工作了,又要回到与代码为伴的生活了,用键盘敲出以后美好的生活吧。
                                                                                                                                                     

posted @ rex mao 阅读(283) | |  

2007年5月31日

 
类设计

    软件中起关键作用的类为charcollector字符收集器类、simpledomparser解析内核类和manager中间层控制类。

字符收集器类

字符收集器类是软件的底层类,它与xml文件交互,读取文件中的字符信息,经过处理,形成标签,文本,属性等数据为上层提供服务。

 

成员变量介绍:

areader:reader对象,输入流为文件输入流,它将xml文件的字符数据以流的形式提供给类。

成员方法介绍:

comparedarray(): 输入:两个int型数组,输出:boolean型,返回两个数组是否相同。用于比较两个数组是否相同,在方法中,对两个数组的数逐一比较。

hasmorechars(): 输入:无,输出:boolean型,表示文件中是否还有字符,该方法用于确定文件中是否还有字符。

peek():          输入:int型数组。用于存储窥探到的字符,输出:无,该方法用于从文件中窥探数组长度的字符数据。窥探就是从文件中读取数据后,将输入流标记回以前的位置,以免丢失数据。

                  算法简述:

areader上标记数组的长度

areader.mark(buffer.length);

2、将数据依次读入数组

for (int i = 0; i < buffer.length; i ) {

            buffer[i] = areader.read();

        }

恢复areader

areader.reset();

peek():    输入:无,输出:int型,是窥探到的字符,该方法从文件中窥探一个字符数据。

processcdata(): 输入:stringbuffer型,用于存放cdata数据,输出:无,用于处理xml文件中的cdata节点。得到的cdata节点存放到stringbuffer对象中。

    算法简述:

预设两个数组

int[] cdatahead = {'<', '!', '[', 'c', 'd', 'a', 't', 'a', '['};

int[] cdatatail = {']', ']', '>'};

窥探cdatahead长度的字符存在数组buf

peek(buf);

比较bufcdatahead数组的内容是否相同,如果不同返回falase,如果相同继续执行。

areader跳过cdatahead的长度,然后循环读取直到窥探的字符数组与cdatatail相同,将中间的字符存放到stringbuffer对象中。

while (true) {

                peek(buf);

                if (comparedarray(buf, cdatatail)) {

                    areader.skip(cdatatail.length);

                    flag = true;

                    break;

                } else {

                    bufchar = areader.read();

                    if (bufchar == -1) {

                        throw new ioexception("cdata node without end tag");

                    }

                    sb.append((char) bufchar);

                }

}

processentity(): 输入:stringbuffer型,用于存放实体数据,输出:无,用语处理xml文件中的内建实体类型。得到的实体存放到stringbuffer对象中。

readtag():输入:无,输出:string型,是读到的标签,从xml文件中读取并整理成一个标签数据存放在string对象中。

    算法简述:

窥探一个字符,如果不是’<’,抛出异常。否则继续执行。

int nextchar = peek();

if (nextchar != '<') {

   throw new ioexception("expect '<',but got '" (char) nextchar "'");

}

窥探一个字符achar

int achar = peek();

如果字符为’<’,进行cdata节点处理

if (achar == '<') {

                if (processcdata(sb)) {

                    achar = peek();

                    continue;

                }

}

 如果字符为’&’,进行内建实体处理

if (achar == '&') {

                if (processentity(sb)) {

                    achar = peek();

                    continue;

                }

}

 如果字符为’>’或文件结束,返回stringbuffer对象。

     如果是其它字符,加入到stringbuffer对象中。

readtext():   输入:无,输出:string型,是读到的文本内容,从xml文件中读取并整理成一个文本数据存放在sting对象中。

skipothertag():   输入:无,输出:无,跳过一个不处理的标签。

skipothertags(): 输入:无,输出:无,跳过多个不处理的标签。

skipwhitespace():输入:无,输出:无,跳过空格。

解析内核类

    该类用于解析xml文件,包含parser()方法,是该类的核心方法。

 

成员变量介绍:

acharcollector:charcollector类对象,负责字符收集。

currentnode: simpleelement类对象,表示当前处理的元素。

elements:     stack类对象,用栈的存储结构,表示元素之间的层次关系。

成员方法介绍:

parser():     输入:无,输出:simpledocument类对象,是返回的整个文档树型结构。

               算法简述:

1、读取一个标签

2、判断是开始标签还是结束标签,如果是结束标签,转入结束标签处理3

如果是开始标签,转入开始标签处理6

3、得到标签的名称,判断是否与currentnode的名称相同,如果相同,执行

4,否则抛出异常

4、判断是否还有标签,如果有继续执行5,否则退出。

5、从栈中弹出一个节点给currentnode,执行1

6、得到标签的名称,属性,文本内容,将标签加入到dom树中,并且压栈。

执行1

算法的程序流程图



中间层管理类

中间层管理类用于控制和协调解析器与用户界面。

 

成员变量介绍:

isparsered: boolean型,判断是否已经解析过了。

document: simpledocument型对象,表示整个xml文档树,也是解析器返回的。

parser:       simpledomparser型对象,表示解析器。

成员方法介绍:

gettreeroot(): 输入:无,输出:defaultmutabletreenode型对象,是得到的树的根节点,用于得到树的根节点。

parser():    输入:无,输出:无,用于执行解析操作。

setinputstream(): 输入:inputstream型对象,是要设置的输入流,输出:无,用于设置解析源。

setxmlfile()     输入:file型对象,是要设置的xml文件,输出:无,用于设置xml文件源。

gettreenode():     输入:simpleelement型对象,是要转换的对象,输出:defaultmutabletreenode型对象,是转换后的对象,用

于转换相应元素为树的节点对象。

 

posted @ rex mao 阅读(1159) | |  

2007年5月27日

 

结构设计

各个类的功能介绍

nodeelementdocumentattrw3cdom规范要求实现的接口。还有其它接口未列出。

simplenode 继承node接口,实现node接口的基本功能。

 

simpleelement继承nodeelement接口,对应dom树中的标准节点,也就是xml文件中的一个标签。

 

simpledocument 继承nodedocument接口,对应整个dom树,它是解析器解析完成后,返回的对象。用户可以使用该对象访问整个dom树。

 

simpleattr 继承nodeattr接口,对应dom树中的属性节点,用于存放属性名称和属性值。

 

charcollector 字符收集器类,它直接与xml文件接触,根据需要向调用者提供下一个标签或文本等数据。

 

simpledomparser 解析器的核心类,它使用charcollector类,得到标签、文本等数据。使用simpleelementsimpleattr等类存放数据,生成simpledocumnet对象返回给调用者。

 

mainframe 用户界面类,它将解析结果展示给用户,并且根据用户的操作,与用户进行交互。

 

manager 中间层管理类,它协调用户界面(mainframe)与解析器内核(simpledomparser)之间的关系,实现解析器的控制。

 

内部接口设计

类名称

调用类

调用功能

simpledomparser

simpleelement

节点的存储,查找,删除。

simpledomparser

simpleattr

属性节点的存储,查找,删除。

simpledomparser

simpledocument

生成dom

simpledomparser

charcollector

字符收集,得到标签与文本等。

manager

simpledomparser

解析xml文档

manager

mainframe

用户界面的相关操作

 

用例关系设计

用例介绍

用户:          参与者, 即软件的使用者。

xml文件:       参与者,xml文件。

链接的文件:    参与者,xml文件中链接的外部文件。

选择xml文件: 用户通过文件选择框选择一个本地的xml文件。

选择url地址: 用户输入一个有效的url,指向网络上的xml格式的网页。

解析xml文件: 用户确定对xml文件进行解析,该项操作要发生在选择xml文件或选择url地址之后。

修改文件:        用户对xml文件进行修改

保存文件:        用户通过文件选择框,选择位置保存xml文件。

选择dom树节点:用户选择解析后的dom树型结构上的节点。

解析器解析:     解析器对xml进行解析

收集字符:        字符收集器负责处理xml的字符数据

界面展示:        通过树型结构和图表向用户展示数据。

 

字符收集器有限状态机

dfa m={s,ts,tp,tq,cp,ep,er,q},{lt,rt,a,c,ec,,eof,nl,nlra},f,s,{q}

 

其中 字符集:

lt={<}

rt={/>}

a={&,<,>,&apos,&qout}

c={

ec={]]>}

eof代表文件结束

nl代表不是<的字符

nlra 代表除去lt,rt,ltl,a,c的所有字符

 

状态:

s 开始状态

ts:标签处理开始状态

tp:标签处理状态

tq:标签处理结束状态

cpcdata节点处理状态

ep:内建实体处理状态

er:错误状态

q:结束状态

 

状态转换函数:

 

f(s,lt)=ts

f(s,nl)=er

f(tp,rt)=tq

f(tp,a)=cp

f(tp,c)=ep

f(ep,ec)=tp

f(ep,eof)=er

f(tq,lt)=ts

f(tq,eof)=q

f(tq,nlra)=tq

 

posted @ rex mao 阅读(1401) | |  

2007年5月26日

 

有时候不想把图片资源放在目录里,让用户看到,我用的方法是将图片的像素矩阵存在代码里。可能比较笨,具体做法是:

mediatracker mt = new mediatracker(aframe); //媒体跟踪器

image img = toolkit.getdefaulttoolkit().createimage("画刷.jpg"); //得到图片

mt.addimage(img, 1);

try {

      mt.waitforall();

   }

catch (interruptedexception ex) {

   }

bufferedimage bi = new bufferedimage(16, 16, bufferedimage.type_int_rgb);

bi.getgraphics().drawimage(img, 0, 0, 16, 16, f);

int[] rbg = new int[bi.getwidth() * bi.getheight()];

bi.getrgb(0, 0, 16, 16, rbg, 0, 16); //利用bufferedimage得到像素矩阵

for (int i = 0; i < rbg.length; i ) {

      system.out.print(rbg[i] ","); //打印

   }

 

再在代码中创建静态对象

private static int[] penpixels = {

      16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,

      16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,

      16777215, 16777215, -16777216, -16777216, -16777216, 16777215, 16777215,

      16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,

      16777215, -16777216, -2031616, -2031616, -2031616, -16777216, 16777215,

      16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,

      16777215, -16777216, -2031616, -1, 16777215, -16777216, 16777215,

      16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,

      -16777216, -16777216, -2031616, -1, -16777216, 16777215, 16777215,

      16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,

      -16777216, -256, -16777216, -16777216, -16777216, 16777215, 16777215,

      16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, 16777215, 16777215, -16777216,

      -256, -1, -1842205, -16777216, 16777215, 16777215, 16777215, 16777215,

      16777215,

      16777215, 16777215, 16777215, 16777215, 16777215, 16777215, -16777216, -1,

      -256, -16777216, -16777216, 16777215, 16777215, 16777215, 16777215,

      16777215,

      16777215, 16777215, 16777215, 16777215, 16777215, -16777216, 16777215,

      -256, -1842205, -16777216, 16777215, 16777215, 16777215, 16777215,

      16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, 16777215, -16777216, -256, -1,

      -16777216, -16777216, 16777215, 16777215, 16777215, 16777215, 16777215,

      16777215,

      16777215, 16777215, 16777215, 16777215, -16777216, -256, -1, -1842205,

      -16777216, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,

      16777215,

      16777215, 16777215, 16777215, 16777215, -16777216, -16777216, -256,

      -16777216, -16777216, 16777215, 16777215, 16777215, 16777215, 16777215,

      16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, -16777216, -16777216, -16777216,

      -16777216, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,

      16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, -16777216, -16777216, -16777216,

      16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,

      16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, -16777216, -16777216, 16777215,

      16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,

      16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, -16777216, 16777215, 16777215,

      16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,

      16777215, 16777215

 };//打印出来的矩阵

private static memoryimagesource mispen = new memoryimagesource(16, 16,

      penpixels, 0, 16);

public static image imgpen = toolkit.getdefaulttoolkit().createimage(mispen);

这样就可以直接使用imgpen图片了。

posted @ rex mao 阅读(1419) | |  

2007年5月23日

 

这是我的毕业设计,本来以为挺简单的,做了以后发现还是能学到点知识,发来给大家一起学习。

dom规范定义了一组接口,用户通过这些接口来访问dom解析器返回的树型结构。dom不同于sax的事件驱动模式,它是将整个文档解析完成后,形成一个树型结构放在内存中。下面是dom规范中的所有接口,灰色显示的是本解析器实现的接口。

 

domimplementation

domimplementation接口允许代码访问dom的具体实现,以找出对各种特性的有效支持。其中的hasfeature(string feature, string version)方法可以测试具体的dom实现是否支持某特性。

 

nodelist

nodelist对象是node对象的一个简单的有序集合。例如,可以用来存放一个节点的子节点。

 

node

node对象是dom中所有节点的基对象。elementattrtextcdatasectionentityreferenceentityprocessinginstructioncommentdocumentdocumenttypedocumentfragmentnotation对象都派生于node对象。

 

namednodemap

namednodemap对象是可以通过猛成访问的node对象集合。可以用来存放节点的属性。

 

domexception

异常接口

 

documentfragment

documentfragment对象是文档片段,是文档(document)对象的一个简单的版本。它可以用来表示文档的任意子树。

 

document

document对象是能在dom示例的主要对象。它代表整个的xml文档,也是解析器返回的对象。

 

element

element对象包含文档中的元素的信息。代表一个标签。

 

attr

attr是属性对象,一个节点的属性存在namednodemap里。

 

characterdata

characterdata对象表示xml文件中的字符信息。

 

documenttype

documenttype对象表示文档类型,也就是dtd声明里的内容。

 

notation

notation对象表示dtd声明中的关于表示法的信息。

 

entity

entity对象包含dtd中有关实体的信息。

 

entityreference

entityreference对象包含对已解析文档中的实体的引用信息。

 

processinginstruction

processinginstruction对象包含文档中内嵌的处理指令的信息。

 

text

text对象表示节点的文本数据。

 

comment

comment对象表示注释。

 

cdatasection

cdatasection对象包含文本中未被解析块的内容。

posted @ rex mao 阅读(1055) | |  

2007年5月15日

好几天没有写了,今天在做毕业设计时遇到要打开系统上的文件,而文件类型事先是不可知的,所以不能用以前知道的那种方法,runtime.getruntime().exec("notepad c:/a.txt");在网上搜到一个类browserlauncher,这个类可以调用文件关联打开文件,好处在于它对不同的系统可以不同的对待,保持了java的跨平台性,有兴趣的可以用google搜browserlauncher,不要用baidu。
我看了一下windows xp/nt系统的调用,就是写成runtime.getruntime.exec("cmd /c start " url);

posted @ rex mao 阅读(878) | |  

2007年4月24日

画图的鼠标事件处理是画图程序中比较复杂的内容,这里只是简单介绍,有兴趣的可以看程序。
         point p0,p1;//
记录拖拽画图的起点和终点
         p0=new point();
         p1=new point();
         //
鼠标按下,主要记录按下的点
         void jpanedraw_mousepressed(mouseevent e) {
            p0=new point(e.getx(),e.gety());
}
         //
鼠标拖拽过程,根据不同的图形,画出拖拽过程的图形,复杂图形可以用矩形代替
         void jpanedraw_mousedragged(mouseevent e) {
         switch(toolmode){
         case 0:{ //
直线
       p1.x = e.getx();
        p1.y = e.gety();
        g.setcolor(col);
        g.drawline(p0.x, p0.y, p1.x, p1.y);
        jpanedraw.repaint();
        break;
   }
         ...//
其它图形
}
}
//
鼠标抬起,根据p0p1生成对应的图形
void jpanedraw_mousereleased(mouseevent e) {
   switch(toolmode){
case 0:{ //
直线
         cusline2d acusshape = new cusline2d(p0.x, p0.y, p1.x, p1.y); //
建立图形
         ...//
将图形加入到图形列表
         break;
}
         ...//
其它图形
}
         jpanedraw.repaint();
}

posted @ rex mao 阅读(2192) | |  

仅列出标题  下一页
网站地图