2006年5月12日

在IBM的JDK环境下进行JVM内存监控的问题

错误信息如下:
java.lang.NoClassDefFoundError: sun.management.ManagementFactory

处理:

sun.management.ManagementFactory替换成java.lang.management.ManagementFactory  

因为ibmjdk没有sun.management.ManagementFactory这个对象

posted @ 2010-11-25 12:01 JGAO编程随笔 阅读(546) | 评论 (0)编辑 收藏

oracel PreparedStatement的setString问题

错误信息如下:

超过最大长度限制

处理:

只能插入666个中文字符。


或者更新到最新的
oracle驱动包

posted @ 2010-11-25 12:00 JGAO编程随笔 阅读(254) | 评论 (0)编辑 收藏

servicemix部署到websphere中,需注意的问题

1derby.jar包可能冲突,需删除项目中的该包

2MBean调用问题

   Websphere的MBean注册路径包括cell,nodeName和processName,具体可以铜鼓jconsole连接来查看MBean注册的全路径。这三个值可以通过Websphere的com.ibm.websphere.management.AdminServiceFactory这个对象来获取,spring中的配置如下:
<!-- 用于获取websphereMBean名称的cell,node,process -->

<bean id="adminService" class="com.ibm.websphere.management.AdminServiceFactory" factory-method="getAdminService"/>

<bean id="adminService.cellName" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>

<bean id="adminService.nodeName" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>

<bean id="adminService.processName" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>

<bean id="websphereNamingStrategy" class="com.des.engine.mbean.WebsphereNamingStrategy">

<property name="cellName" ref="adminService.cellName"/>

<property name="nodeName" ref="adminService.nodeName"/>

<property name="processName" ref="adminService.processName"/>

</bean>

WebsphereNamingStrategy为自己创建的对象就包括那三个属性

3:安全问题

出现如下错误,Caused by: javax.management.JMRuntimeException: ADMN0022E: 由于凭证不足或凭证为空,无法对 org.apache.servicemix:Name=ServiceMgtImpl,cell=dvpbNode02Cell,Type=SystemService,ContainerName=ServiceMix,node=dvpbNode02,process=server1 MBean  retrieveServiceList 操作进行访问。

    该问题是因为设置了安全控制,把控制台的【安全性->安全管理、应用程序和基础结构】里面的所以安全配置都去掉,然后重新启动服务器主机(注意是重启主机,不然安全设置不起作用),再启动websphere服务应该就可以了,还有就是servicemix的应用要跟websphere一起启动,不要等websphere启动后再到控制台启动

posted @ 2010-11-25 11:58 JGAO编程随笔 阅读(881) | 评论 (2)编辑 收藏

ResultSet内存溢出OutOfMemory问题

错误信息如下:

jdbc在操作oracle海量数据的时候用ResultSet获取所有的返回数据出现内存溢出

处理:
出错的原因是ResultSet用的是可滚动结果集,正常情况下ResultSet是指针指向数据库的数据,本身是不存储数据库的数据的,默认情况下就算是提交的sql能查询处上亿条的数据也是不消耗内存的,但是如果用的是可滚动结果集的ResultSet情况就不一样了,ORACLE 是不支持可滚动结果集的,那么我们用JDBC得到一个可滚动的结果集就是由JDBC自己支持的,也就是说结果集是要存放在内存中的,所以在海量数据的情况下也就是要消耗大量内存的,因此造成内存溢出也就是正常的了,所以如果是海量数据的话就不要用可滚动结果集就可以了。

posted @ 2009-06-23 21:19 JGAO编程随笔 阅读(2082) | 评论 (0)编辑 收藏

com.ibm.websphere.ce.cm.StaleConnectionException: [ibm][db2][jcc][t4][2030][11211] 检测到了通信错误

错误信息如下:

com.ibm.websphere.ce.cm.StaleConnectionException: [ibm][db2][jcc][t4][2030][11211]

检测到了通信错误。所使用的通信协议:TCP/IP"n所使用的通信 APISOCKETS

检测到错误的位置:Reply.fill()"n用于检测错误的通信功能:InputStream.read()

特定于协议的错误代码数据不足、 0。消息:null"n   

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)"n     

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:67)"n    at

sun.reflect.DelegatingConstructorAccessorImpl.newInstance

(DelegatingConstructorAccessorImpl.java:45)"n

at java.lang.reflect.Constructor.newInstance(Constructor.java:522)"n  

at com.ibm.websphere.rsadapter.GenericDataStoreHelper.mapExceptionHelper

(GenericDataStoreHelper.java:523)"n   

at com.ibm.websphere.rsadapter.GenericDataStoreHelper.mapException(GenericDataStoreHelper.java:578)"n      

at com.ibm.ws.rsadapter.jdbc.WSJdbcUtil.mapException(WSJdbcUtil.java:909)"n 

at com.ibm.ws.rsadapter.jdbc.WSJdbcStatement.executeQuery(WSJdbcStatement.java:898)"n   

at com.newland.bi.util.db.DBUtil.executeQuery(Unknown Source)"n

at com.newland.bi.util.db.DBUtil.executeSql(Unknown Source)"n     

at com.newland.bi.dao.jdbc.DaoImpl.executeQuery(DaoImpl.java:64)"n   

at com.newland.bi.service.report.exp.dao.ReportExpDao.getExpList(ReportExpDao.java:72)"n 

at com.newland.bi.service.report.exp.manage.ReportExpMgt.runExport(ReportExpMgt.java:91)"n   

at com.newland.bi.service.report.exp.servlet.ReportExp1Servlet$1.run(ReportExp1Servlet.java:97)"n      

at java.util.TimerThread.mainLoop(Timer.java:537)"n       at java.util.TimerThread.run(Timer.java:487)"n

处理:

出错的原因可能是防火墙问题,websphere应用服务器和数据库服务器之间是否存在防火墙

防火墙是否会设置多久没活动的连接就自动断开掉,如果是这样的话就会有问题,因为websphere上面的数据库连接池可能有一段时间没连接而被防火墙断掉了

但对于连接池本身根本就不知道该连接是否还可用,所以web应用从连接池获取的连接可能就是已经断开的了,所以就可能会出现日记中的错误问题


 

posted @ 2009-06-23 21:14 JGAO编程随笔 阅读(7399) | 评论 (1)编辑 收藏

Timer.schedule和Timer.scheduleAtFixedRate的区别

schedulescheduleAtFixedRate的区别在于,如果指定开始执行的时间在当前系统运行时间之前,scheduleAtFixedRate会把已经过去的时间也作为周期执行,而schedule不会把过去的时间算上。

posted @ 2009-06-23 21:13 JGAO编程随笔 阅读(992) | 评论 (0)编辑 收藏

cxf找不到类org.apache.axis.soap.MessageFactoryImpl出错

 

错误信息如下:

Caused by: java.lang.ClassNotFoundException: org.apache.axis.soap.MessageFactoryImpl

    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)

    at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:50)

    ... 10 more

处理:

原因是调用了axis soap.MessageFactoryImpl,cxf应该用的是sun
     在注册安全拦截器之前执行下面代码就可以了

System.setProperty("javax.xml.soap.MessageFactory", "com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl");

posted @ 2009-06-23 21:10 JGAO编程随笔 阅读(1239) | 评论 (0)编辑 收藏

浏览器下载txt文件问题

我们写程序的时候可能会想用open或者<a>来下载一个txt文件,但我们会发现我们用浏览器下载这个txt文件的时候老是在浏览器里面直接打开了,而不是提示下载,这样的话如果txt文件的内容非常多的话肯定是不行的,可能就会导致浏览器挂掉,客户机器死机的问题
现整理了个解决办法,代码如下:

1.下载页面
open(action执行页面,'iframeName','');
2.action执行页面
<id="tempB" style="display:none" href="#" onclick="">&nbsp;</a>
<iframe width=0 height=0 id="hideIframe" name="hideIframe"></iframe>
<script>
    
var n=0;
    
function go(url){
        
        n
==0?new function()
        
{
            frames(
"hideIframe").location=url,n=1
        }
:null;
        
        document.all(
"hideIframe").readyState!="complete"?setTimeout(go,10):so();
        
        
function so()
        
{
            frames(
"hideIframe").document.execCommand("SaveAs"),n=0
        }
;
    }

    
    
var tempB = document.getElementById("tempB");
    
<%
        
if(path.toLowerCase().indexOf(".txt")>=0){
    
%>
    tempB.attachEvent('onclick',
function(){go('<%=request.getContextPath()+"/tempfile/1.txt">');});
    
<%
        }
else{
    
%>
    tempB.attachEvent('onclick',
function(){open('<%=request.getContextPath()+"/tempfile/1.xls">','','');});
    
<%
        }

    
%>
    tempB.click();
</script>


posted @ 2008-11-23 19:28 JGAO编程随笔 阅读(745) | 评论 (0)编辑 收藏

websphere部署war应用失败

websphere部署war应用失败正常原因是web.xml的节点定义循序问题,或者一些空格,字符原因造成的
可能先定义完所有的servlet后再定义所有的servlet mapping就没问题了

posted @ 2008-08-23 15:27 JGAO编程随笔 阅读(626) | 评论 (0)编辑 收藏

通过jsf事件转向后的页面中文乱码

那个转向后的页面已经有用gb2312的编码了
可能原因是在java类里面调用了((HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse()).getWriter().write("");
然后再转向某个页面,这样可能导致编码格式冲突,导致乱码
可以先给resonse设置下编码格式,然后在write
HttpServletResponse httpServletResponse = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.setContentType("text/html; charset=gb2312");
httpServletResponse.setCharacterEncoding("gb2312");
httpServletResponse.getWriter().write("");
这样应该就可以解决了

posted @ 2008-06-26 23:46 JGAO编程随笔 阅读(577) | 评论 (0)编辑 收藏

websphere的servlet配置无效问题

C:\Program Files\IBM\WebSphere\AppServer\profiles\AppSrv01\config\cells\app-bi2Node01Cell\applications\appname.ear\deployments\appname\appname.war\WEB-INF\web.xml 该目录下的web.xml的修改才是有效

应用程序发布的目录下的那个web.xml添加的servlet配置是无效的

posted @ 2008-04-28 18:06 JGAO编程随笔 阅读(1447) | 评论 (3)编辑 收藏

jsp的request.getParameter获取不到表单参数

可能原因:

1: form表单中的控件没有定义name属性

2: form表单中的控件被设置成disabled

3: form表单的enctype="multipart/form-data"是一种用于上传文件的表单

解决方法:

对于第三种情况我们直接request.getParameter来取参数值是取不到的

我们可以借用apache的上传组件来解决

用到jarcommons-fileupload-1.1.1.jar

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileItemFactory;

import org.apache.commons.fileupload.FileUploadException;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

    /**

     *获取各种类型表单的表单参数

     *@paramrequest HttpServletRequest请求对像

     * @paramparamName 参数名

     *@return

     *@throwsFileUploadException

     */

    publicstatic String getParameterValue(HttpServletRequest request,String paramName) throws FileUploadException{

    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    if(isMultipart==true){

        FileItemFactory factory = new DiskFileItemFactory();

        ServletFileUpload upload = new ServletFileUpload(factory);

        List fileItemList = upload.parseRequest(request);

        if(fileItemList!=null){

           for(Iterator itr=fileItemList.iterator();itr.hasNext();){

               FileItem fileItem = (FileItem)itr.next();

               if(fileItem.getFieldName().equalsIgnoreCase(paramName)){

                   return new String(fileItem.getString().getBytes("ISO8859-1"))//中文转码

               }

           }

        }

    }else{

        return new String(request.getParameter(paramName).getBytes("ISO8859-1"))//中文转码

    }

    return"";

    }

posted @ 2007-12-14 19:07 JGAO编程随笔 阅读(14844) | 评论 (6)编辑 收藏

初学jsf自定义标签时遇到的问题总结

1.定义一个标签要用到两个java类,这个跟jsp的自定义标签有点不一样
  第一个类继承UIComponentTag, 用于定义标签的属性和设置标签的所有属性值到控件的map属性attributes或valueBinding中
  第二个类继承UIInput或者UIOutput,用于渲染标签的内容,真正打印标签内容的地方就在这里
   
2.这两个类是怎么联系的
 我们需要像定义jsf的bean的影射文件一样,在faces-config.xml或者自己定义的xml文件里面定义第二个类
 如:
 
<faces-config>
  
<!--分页标签-->
  
<component>
    
<component-type>pageTag</component-type>
    
<component-class>com.jsf.PageComponent</component-class>
  
</component>
  
  
</faces-config>
  然后第一个类要实现父类的一个方法 public String getComponentType();从这里返回一个字符串pageTag,这样就跟第二个类联系起来了

3.标签属性的定义
  标签属性的定义一般都是可转化为字符串的类型的,除非你还是用
<%=rowList%>这种jsp赋值的方式
  别以为你定义的一个List类型的属性可以用jsf的EL表达式可以直接赋值进来,EL表达式传进来以后属性接收的就是这一串EL表达式
  所以就是说你的属性就是要字符串类型的

4.那么jsf自定义标签是怎么接收EL表达式绑定的列表的
 先通过父类的isValueReference(属性值),来判断该属性的值是否是一个EL的表达式
 如果是则通过获取绑定值得方式把真正的属性的值设置到标签父类的valueBinding对像中
 否则直接把属性的值添加到标签父类的attributes对像中
  if (isValueReference(属性值)) {
    javax.faces.el.ValueBinding vb = Util.getValueBinding(value.toString());
    component.setValueBinding(name, vb); //component就是标签对像,name就是标签的属性名称
 } else {
    component.getAttributes().put(name, 属性值);
 }

 这就是个设置属性值的过程,可以在第1点说的第一个类里面的protected void setProperties(UIComponent component)方法
5.现在知道标签属性值的作用了吗
 是的标签属性值只不过是起个作用而已,而不是我们真正所要的值
 也就是说我们是不能从这些属性中直接取值的
 
6.那么我们怎么取属性的真正的值呢
 可以先从第4点说的标签父类的attributes对像中取值
 如果取不到值那就到标签父类的valueBinding对像中取值
 说白了就是,通过第4步我们属性的真正的值不是放在attributes就是在valueBinding中
 Object obj = component.getAttributes().get(name); //component就是标签对像,name就是标签的属性名称
 if (obj == null) {
   ValueBinding vb = component.getValueBinding(name);
   if (vb != null) {
    return vb.getValue(context);
   } else {
    return null;
   }
 }
 这个过程就是取属性值的过程,在第1点说的第二个类里面进行
 
7.现在属性值也可以取到了,那么我们要怎么打印标签的内容呢
  我们可以在第二个类的encodeBegin或者encodeEnd中进行
  public void encodeBegin(FacesContext context) throws IOException
  public void encodeEnd(FacesContext context) throws IOException
 
  取属性值的过程也可以在这里进行,取完值后就是把值组装到标签内容的相应位置中就完了
  
  基本上就是这几点

posted @ 2007-11-21 19:21 JGAO编程随笔 阅读(2143) | 评论 (4)编辑 收藏

ajax4jsf跟outputStream.write冲突?

我在项目中引入ajax4jsf框架
web.xml中加入

 <filter>
        
<display-name>Ajax4jsf Filter</display-name>
        
<filter-name>ajax4jsf</filter-name>
        
<filter-class>org.ajax4jsf.Filter</filter-class>
  
</filter>
  
<filter-mapping> 
      
<filter-name>ajax4jsf</filter-name>
      
<servlet-name>Faces Servlet</servlet-name>
      
<dispatcher>REQUEST</dispatcher>
      
<dispatcher>FORWARD</dispatcher>
      
<dispatcher>INCLUDE</dispatcher>
 
</filter-mapping>


结果以前的输出文件到客户端的代码就出问题了

                InputStream fileInputStream = mgt.downloadToStream(result_pathEl.getTextTrim());
                mgt.deleteFile(result_pathEl.getTextTrim());
//删除临时的报表文件
                JSFUtil.setSessionAttribute(sessionId, "true");
                
if( fileInputStream == null ){
                  System.out.println(
"==========get inputstream is null========");
                }


                OutputStream o 
= response.getOutputStream();
                response.reset();
                response.setContentType( 
"APPLICATION/OCTET-STREAM" );
                response.setHeader( 
"Content-Disposition""attachment;filename=\"" + "exportExcel.xls""\"" );

                
int length;
                
byte buf[] = new byte[1024];

                
while ( ( length = fileInputStream.read( buf, 01024 ) ) != -1 ) {
                    o.write( buf, 
0, length );
                }

                o.flush();
                o.close();
                fileInputStream.close();


提示错误如下:主要是o.write出问题

java.lang.NullPointerException
        at org.ajax4jsf.framework.ajax.xmlfilter.FilterServletResponseWrapper$By
teArrayServletOutputStream.write(FilterServletResponseWrapper.java:290)


把web.xml中的ajax4jsf的filter给去掉后,一切又恢复正常

有那位仁兄遇到同样情况的吗?

posted @ 2007-11-19 20:16 JGAO编程随笔 阅读(448) | 评论 (1)编辑 收藏

取程序的绝对路径问题

在本地tomcat5中这样没问题
request.getRealPath("/")+"report/config/configFile/"+priv_id+".xml"

但是发布到websphere6后就出问题了
要改成
request.getRealPath("/")+"/report/config/configFile/"+priv_id+".xml"

就是report前要加个"/" 斜杠,加了后tomcat5下也是正确的

posted @ 2007-11-09 18:25 JGAO编程随笔 阅读(246) | 评论 (0)编辑 收藏

程序从oracle移植到db2遇到的问题

 

1.jdk环境问题

jdk环境要改为ibm jdk 5.0, 不然连接不上数据库, 数据库连接池的连接失败,c3p0连接池的连接失败,目前还是默认的方式采用应用服务器的连接池,像tomcat就采用tomcat配置的连接池

eclipse 的开发时用的jre如果修改为ibm的以后,有可能会导致编译不了,这要修改编辑器java类型的编码为gb2312就可以了,genaral->content type –java file

2. 程序中编写sql时的用户模式问题

用户模式要用公共常量,以便修改

不同用户模式之间的表的访问通过授权来解决

3. db2数据库的函数问题

程序中的添加和修改时间的地方的日期函数都要修改成

Date(“2007-01-01”)就是字符串中间有带中杠的

日期转字符串要把原先的to_char改成char(int(2007-01-01))

Kpi的消息串在配置中在取权限priv_id的字符串要加上char(int(priv_id)),如果直接char(priv_id)会多出一个点号

4. oracle树形结构的查询移植到db2存在问题

菜单查询中,有存在层次level的没实现,目前我先通过自己写的函数实现,但存在问题跟没有层次的实现方式一样存在问题

因为通过in的方式,in的存在字段是有限的到时候数据量变多了,sql就会执行失败,可以考虑临时表来解决

5. 序列表seq的长度问题

所有的序列表的序列长度db2是有限制的,好像不能大于8位,这样序列的字段都要做修改,而且不能重复,要进一步确认修改

7. 系统权限移植问题

地区编码的字段从数值型改为字符串类型,很辛苦,建议以后程序的bean的属性都用字符串来定义,避免程序移植的类型修改的问题

8. erwin数据模型问题

数据模型中的部分表没有及时更新,跟开发时用的表有出入,以后数据模型要及时更新

9. 建表的sql语句问题

       建表的sql

 number(12) 这样的都要改成decimal(12,0)

 varchar2都要改成varchar

posted @ 2007-10-27 23:27 JGAO编程随笔 阅读(391) | 评论 (0)编辑 收藏

用ibm的东西

用ibm的东西前先装ibm的jdk

posted @ 2007-10-20 15:33 JGAO编程随笔 阅读(172) | 评论 (0)编辑 收藏

表单提交后获取不到控件的值

有时候我们在表单提交后却获取不到控件的值
可能原因:
1. 控件少了name属性
2.控件被设置成disabled

posted @ 2007-07-06 23:38 JGAO编程随笔 阅读(351) | 评论 (0)编辑 收藏

OutputStream 转 InputStream

使用场合: 操作excel或pdf等文件时需要先写到输出流, 然后又要用到ftp上传该excel或pdf文件需要用到输入流作为参数,这时候我们就可以直接把该文件的输出流转为输入流直接上传到ftp服务器上

  1.
  ByteArrayOutputStream os 
= new ByteArrayOutputStream();
  InputStream is 
= new ByteArrayInputStream(os.toByteArray());

posted @ 2007-06-18 22:41 JGAO编程随笔 阅读(4415) | 评论 (0)编辑 收藏

设置file控件的按钮样式

网上找的,分享一下
<html>
<script>
function fclick(obj){
with(obj){
style.posTop
=event.y-offsetHeight/2
style.posLeft
=event.x-offsetWidth/2
}

}

</script>
<style>
input
{border:1px solid #333333;color:#666666;background:#eeeeee;font:normal 12px Tahoma;height:18px}
</style>
<br>
<br>
<br>
<table>
<tr>
<td>
<form method="post" action="" enctype="multipart/form-data">
<input id="f_file">&nbsp;<input type="button" onmouseover="fclick(t_file)" value="选择上传文件">
<br>
<input name="upload" type="file" style="position:absolute;filter:alpha(opacity=10);width:30px;" id="t_file" onchange="f_file.value=this.value" hidefocus>
<br><input type="submit" value="提交">
</form>
</tr>
</table>
</html>

posted @ 2007-06-14 23:03 JGAO编程随笔 阅读(2477) | 评论 (3)编辑 收藏

进度条思想

后台数据处理完成的时候设置一个处理完成的session标志
前台通过发送ajax请求设置成功标志的session的页面,如果session的成功标志为true则数据处理完成,关闭正在处理的进度条图片,否则继续发送ajax请求,显示正在处理的进度条图片,当然也可以通过后台返回数据处理完成的百分比,来制作精确的进度条

posted @ 2007-06-14 23:00 JGAO编程随笔 阅读(211) | 评论 (0)编辑 收藏

动态设置checkbox的checked属性

当我们在做动态生成checkbox和动态设置checkbox的checked属性的时候要注意
只有checkbox在页面生成以后设置checkbox的checked属性才有效,否则是无效的
也就是说不要在create checkbox后就设置checked属性,要等到该checkbox已经append到页面中了在来设置checked属性这样才可以

posted @ 2007-05-22 23:44 JGAO编程随笔 阅读(1525) | 评论 (1)编辑 收藏

response.sendredirect的问题

1) 使用response.sendredirect重定向是没办法通过request.setAttribute来传递对象到另外一个页面的
但我们可以通过转发的方式来实现request.getRequestDispatcher("test2.jsp").forward(request,response)
这也是struts默认的页面跳转方式,这就是为什么我们可以在action里面request.setAttribute然后在页面里request.getAttribute

2) 使用response.sendredirect重定向要记得在后面加上return不然后面的语句还是会继续往下执行的,还有就是response.sendredirect之前最好不要有任何的输出语句包括html不然可能会重定向失败
最近我还遇到一个比较奇怪的问题就是response.sendredirect失败,因为我的端口是通过交换机来转换的所以可能就是在这里重定向不过去了,所以建议以后大家都使用request.getRequestDispatcher("test2.jsp").forward(request,response)这种方式就不会错了,当然也可以用jsp标签的forward

posted @ 2007-05-07 21:47 JGAO编程随笔 阅读(1073) | 评论 (0)编辑 收藏

可定制生命周期的缓存

     摘要: 1) ICache.java 缓存接口 package com.jgao.cache;/** *//** * 缓存接口 * @author jgao * */public interface ICache {      ...  阅读全文

posted @ 2007-04-22 06:18 JGAO编程随笔 阅读(1001) | 评论 (0)编辑 收藏

获取第N级的所有节点实现代码

    基本的思想和步骤都在了,主要就是递归

    /**
     * 传入级数返回存放该级数下所有组织列表的列表
     * @param lever int 组织级数
     * @return List<List> 存放组织列表
     */

    public List<List> getTreeLeverNode(int lever) {
        String sqlstr = "select  ID from table1 where PARENT_ID=0";
        Result ret = Dao.executeQuery(sqlstr);
        List<List> list = new Vector<List>();
        List rslist = new Vector();
        List<String> nodeList = new Vector<String>();
        for (int i = 0; i < ret.Length(); i++) {
            rslist = getNextNode(Integer.parseInt(ret[i]
                        .toString()), lever - 1, nodeList);
                list.add(rslist);
        }
        return list;
    }

    /**
     * 返回存放该级数下所有组织的列表
     * @param reqParentid 请求传入的父节点ID
     * @param lever 组织级数
     * @param list 存放该级数下所有组织的列表
     * @return List<String> 存放组织
     */

    public List<String> getNextNode(int reqParentid, int lever, List list) {
        String sqlstr = "select  ID from table1 where PARENT_ID="
                + reqParentid;
        DBResult ret = super.executeQuery(sqlstr);
        List rslist = new Vector();
        lever = lever - 1;
        if (lever > 0) {
           for (int i = 0; i < ret.Length(); i++) {
                 rslist = getNextNode(Integer.parseInt(ret[i]
                        .toString()), lever , nodeList);
                list.add(rslist);
           }
        } else {
            for (int i = 0; i < ret.Length(); ; i++) {
                list.add(ret[i].toString());
            }
        }
        return list;
    }

posted @ 2007-01-15 20:30 JGAO编程随笔 阅读(120) | 评论 (0)编辑 收藏

erwin连接oracle9i数据库

刚使用erwin时在连接oracle9i数据库时的那个连接串我一直用jdbc连接oracle的那个格式,所以一直连都连不上
一直出现“内部错误,hostdef扩展名不存在”,很是郁闷,不知大家有没遇到
后来查了一下,才知道本地的话要进行本地的Net服务名配置
配置工具在开始->oracle->Configuration and Migration Tools->NET CONFIGUATION ASSISTANT
然后选择本地的Net服务名配置,在配置到服务名的时候把你的数据库名称添进去,然后往下到完成就行了

也可以直接编辑tnsnames.ora,如下图:

接下来在erwin进行正向或者反向工程的操作界面,提示连接数据库的那个连接字符串里输入你的那个服务名就行了,当然用户名密码还是要跟之前的一样,如下图:

posted @ 2007-01-14 17:23 JGAO编程随笔 阅读(3374) | 评论 (15)编辑 收藏

获取第N级的所有节点

/**
*临时写的伪代码
*/

//获取第N级的所有节点

public list getTreeLeverNode(int lever)
  rs0 = select id from menu where parentid is null;  //先从数据库取出第一级的所有节点
  if(lever<=1)
  return rs0
  //循环第一级的节点递归取下面的节点
  for(int i=0; i<rs0.length; i++){
   rslist = getNextNode(rs0[i],lever-1);
   list.add(rslist);
  }
  return rs1;
}

public list getNextNode(int reqParentid,int lever){
  rs2 = select id from menu where parentid = reqParentid;
  lever = lever -1;
  if(lever>0){
   for(int i=0; i<rs2.length; i++){
    rs2 = getNextNode(rs2[i],lever);
    list.add(rs2);
   }
  }
  return rs2;
}

posted @ 2007-01-14 16:01 JGAO编程随笔 阅读(160) | 评论 (0)编辑 收藏

数据操作控制

      1.当执行一个功能的时候需要执行多个更新操作,如:插入多个对象,删除多个对象等,就可能存在执行一个更新操作成功之后下一个更新操作失败,那么这个功能的执行就算是失败的,可是却向数据库添加或删除了不完全的相关数据,所以就会出现脏数据
      解决方法:
      1) 通过事物控制让多个执行语句一起提交commit,commit失败的话就回滚rollback,做到事物的原子性原则
      2) 在数据库设置一个操作成功或失败的字段(或者本地临时文件里存放相关的控制数据),通过该字段进行控制,在执行出错后删除所有含有操作失败字段的数据
       
      2.数据库同步访问控制:比如说一条记录有两个以上的用户同时访问,他们读取出来的是相同的数据,但写入时有先后,如果不做控制就会出现后来写入的数据把原来做了更新的数据覆盖,使原来做的更新操作丢失就是无效,因为他们都是在最原始读取出来的数据上做的修改,而不是在别人做了修改后的数据上做修改
      解决方法:
      1) 可以在数据库多设置一个版本字段来控制该数据的历史版本号(或者本地临时文件里存放相关的控制数据),就是没个人做了修改以后都要更新一下这个版本字段,同时更新之前也要做一下版本的比较,如果现在的版本和之前取出来的数据的版本不一样,那么就要从新读取数据再写入,这样就可以保证不会丢失修改
     

posted @ 2007-01-14 12:00 JGAO编程随笔 阅读(175) | 评论 (0)编辑 收藏

tomcat下jsf移到weblogic8下出错

错误如下:Servlet: "Faces" failed to preload on startup in Web application
我的方法是修改web.xml如下:
<?xml version="1.0" encoding="gb2312"?>
<web-app xmlns="
http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 <context-param>
  <param-name>javax.faces.CONFIG_FILES</param-name>
  <param-value>/WEB-INF/faces-config.xml</param-value>
 </context-param>
 
  //listener节点是新加的
 <listener>
  <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
 </listener>
 
 <servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>-1</load-on-startup>//本来是0先在改为-1
 </servlet>
 
 <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>*.faces</url-pattern>
 </servlet-mapping>
</web-app>

posted @ 2006-12-07 17:45 JGAO编程随笔 阅读(799) | 评论 (3)编辑 收藏

tomcat 同时开多个端口

tomcat要同时开多个端口只要配置conf文件夹下面的server.xml增加Service节点就可以了,如下我多开了个8083端口,同时我把Catalina文件夹多拷贝了一份另存为Catalina2
<Server port="8005" shutdown="SHUTDOWN" debug="0">


  <!-- Comment out these entries to disable JMX MBeans support -->
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"
            debug="0"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"
            debug="0"/>

  <!-- Global JNDI resources -->
  <GlobalNamingResources>

    <!-- Test entry for demonstration purposes -->
    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>

    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
       description="User database that can be updated and saved">
    </Resource>
    <ResourceParams name="UserDatabase">
      <parameter>
        <name>factory</name>
        <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
      </parameter>
      <parameter>
        <name>pathname</name>
        <value>conf/tomcat-users.xml</value>
      </parameter>
    </ResourceParams>

  </GlobalNamingResources>

  <!-- Define the Tomcat Stand-Alone Service -->
  <Service name="Catalina">

    <!-- Define a non-SSL Coyote HTTP/1.1 Connector on the port specified
         during installation -->
    <Connector
port="8081"               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000"
               disableUploadTimeout="true" />

    <!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 -->
    <Connector port="8009"
               enableLookups="false" redirectPort="8443" debug="0"
               protocol="AJP/1.3" />
        
    <!-- Define the top level container in our container hierarchy -->
    <Engine name="Catalina" defaultHost="localhost" debug="0">
      <!--
      <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
      -->

      <!-- Global logger unless overridden at lower levels -->
      <Logger className="org.apache.catalina.logger.FileLogger"
              prefix="catalina_log." suffix=".txt"
              timestamp="true"/>


      <!-- This Realm uses the UserDatabase configured in the global JNDI
           resources under the key "UserDatabase".  Any edits
           that are performed against this UserDatabase are immediately
           available for use by the Realm.  -->
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                 debug="0" resourceName="UserDatabase"/>

      <!-- Define the default virtual host -->
      <Host name="localhost" debug="0" appBase="webapps"
       unpackWARs="true" autoDeploy="true">


        <Logger className="org.apache.catalina.logger.FileLogger"
                 directory="logs"  prefix="localhost_log." suffix=".txt"
            timestamp="true"/>

        <!--
          <Context path="" docBase="ROOT" debug="0">
        -->
      </Host>

    </Engine>

  </Service>
 
    <Service name="Catalina2">

    <Connector
port="8083"               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000"
               disableUploadTimeout="true" />


    <!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 -->
    <Connector port="8010"
               enableLookups="false" redirectPort="8443" debug="0"
               protocol="AJP/1.3" />

        
    <!-- Define the top level container in our container hierarchy -->
    <Engine name="Catalina2" defaultHost="localhost" debug="0">


      <!-- Global logger unless overridden at lower levels -->
      <Logger className="org.apache.catalina.logger.FileLogger"
              prefix="catalina_log." suffix=".txt"
              timestamp="true"/>

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                 debug="0" resourceName="UserDatabase"/>


      <Host name="localhost" debug="0" appBase="webapps"
       unpackWARs="true" autoDeploy="true">


        <Logger className="org.apache.catalina.logger.FileLogger"
                 directory="logs"  prefix="localhost_log." suffix=".txt"
            timestamp="true"/>

      </Host>

    </Engine>

  </Service>

</Server>

posted @ 2006-12-07 14:23 JGAO编程随笔 阅读(2555) | 评论 (0)编辑 收藏

eclipse 配置weblogic服务器

我刚配置时出现的错误及解决方法:
1.启动时出现如下错误
The WebLogic Server did not start up properly.
java.io.InvalidClassException: javax.management.MBeanAttributeInfo; local class incompatible: stream classdesc serialVersionUID = 7043855487133450673, local class serialVersionUID = 8644704819898565848
 at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:519)
 at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1546)
 at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1460)
 at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1546)
 at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1460)
 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
 at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1628)
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1293)
 at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912)
 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836)<2006-12-6 下午05时39分36秒 CST> <Info> <Configuration Management> <BEA-150016> <This server is being started as the administration server.>
<2006-12-6 下午05时39分36秒 CST> <Info> <Management> <BEA-141107> <Version: WebLogic Server 8.1 SP2  Fri Dec 5 15:01:51 PST 2003 316284
WebLogic XMLX Module 8.1 SP2  Fri Dec 5 15:01:51 PST 2003 316284 >

原因是配置weblogic时用了jdk1.5改成weblogic自带的jdk1.4就可以解决了

2.启动时出现如下错误
***************************************************************************
The WebLogic Server did not start up properly.
Exception raised: 'weblogic.management.configuration.ConfigurationException: Unable to locate server named myServer in the configuration file config.xml. Please ensure the argument -Dweblogic.Name=<serverName> matches a server name in that file, for example: <Server ... Name="someName"/>.A single server was found namedmyserver'
Reason: weblogic.management.configuration.ConfigurationException: Unable to locate server named myServer in the configuration file config.xml. Please ensure the argument -Dweblogic.Name=<serverName> matches a server name in that file, for example: <Server ... Name="someName"/>.A single server was found namedmyserver
***************************************************************************
原因是配置weblogic信息时的内容跟你的F:\bea\user_projects\domains\mydomain\
config.xml文件里的内容不一致包括大小写,改过来就行了
主要是domain name和server name 如下是mydomain
myserver
<Domain ConfigurationVersion="8.1.2.0" Name="mydomain">
    <Server ListenAddress="localhost" ListenPort="7001" Name="myserver"

posted @ 2006-12-06 17:47 JGAO编程随笔 阅读(1255) | 评论 (0)编辑 收藏

jdbc 连接sqlserver的问题

很多人刚开始在用jdbc连接sqlserver时都出现问题,也就是连接不上
大部分的什么配置工作啊,驱动程序啊,程序的连接语句啊这些相信都没错,因为网上随便都能找到,而且说得也很清楚了
最主要的一个原因可能就是sp3补丁没打,打完后或许就能连接上了

posted @ 2006-11-08 21:43 JGAO编程随笔 阅读(191) | 评论 (0)编辑 收藏

bgcolor 郁闷了我一整天

 var row=document.createElement('tr');
 row.setAttribute('bgcolor','#00CCFF');


这样设置了半天就是没效果,找了半天就是找不出原因

后来我直接在页面上写<tr bgcolor="#00CCFF"></tr>
然后在程序里innerHTML
发现两个bgcolor打印出来是不一样的

我程序里的是原样的bgcolor而静态写好的bgcolor却变成bgColor看到没c变成了大写了,然后我也跟着改成 row.setAttribute('bgColor','#00CCFF');
神了真的就可以了,哎无语啊!

posted @ 2006-09-21 11:07 JGAO编程随笔 阅读(246) | 评论 (0)编辑 收藏

ajax+strutsAction 小例子

本程序对ajax的一些基础调用进行了封装,使用者只要实现具体的事件驱动程序就可以
了,如本例子的doTest.js, 然后把该文件引进相对应的jsp文件里面,如test.jsp


test.jsp


<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<script src="ajaxjs/ajaxInit.js" type="text/javascript"></script>
<script src="ajaxjs/doTest.js" type="text/javascript"></script>
<html>
  <body>
  <input name="testText" type="text" value="">
  <input type="button" value="test" onclick="doTestRequest(document.getElementById('testText').value,'jgaopass','doTestAfterRequest','responseText');">
  </body>
</html>


doTest.js


//测试函数
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* 请求
* doAfterRequestMethodName 请求成功后的要执行的函数名称
* responseTypeName ajax异步调用后返回的内容的类型,可以使responseText或者responseXml
*/

function doTestRequest(userName, userPwd, doAfterRequestMethodName, responseTypeName){ 
 var param = setQueryString('userName',userName,'userPwd',userPwd);
 sendRequest('toStrutsAjaxTest.do',param,doAfterRequestMethodName,responseTypeName);
}

//请求成功后的执行内容
function doTestAfterRequest(responseString){
 var teststring = document.getElementById("testText");
 teststring.value = responseString;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


ajaxInit.js

//全局变量
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

var xmlHttp = false;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  

//公共函数
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//创建XMLHttpRequest对象

function createXMLHttpRequest() {   
 if (window.XMLHttpRequest) {//Mozilla 等浏览器     
  xmlHttp = new XMLHttpRequest();
     } else {     
      if (window.ActiveXObject) {// IE浏览器
       try {
        xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
       }
       catch (e) {
        try {
          xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
                  catch (e) {
                  }
            }
        }
 }
   if (xmlHttp.overrideMimeType) {//修改MiME类型
    xmlHttp.overrideMimeType("text/xml");
   }  
   if (!xmlHttp) {//创建XMLHttpRequest失败
    window.alert("创建XMLHttpRequest失败");
     return false;
   }
}

//向后台发送请求的参数设置
function setQueryString(){
 var param="";
  for(var i=0;i<arguments.length;i++){
  param+=arguments[i]+'='+encodeURI(arguments[i+1]);
  if(i!=arguments.length-2){
   param+="&";
   i++;
  }else{
   break;
  } 
 }
 return param;
}

/**
* 发送请求
* doAfterRequestMethodName 请求成功后的要执行的函数名称
* responseTypeName ajax异步调用后返回的内容的类型,可以使responseText或者responseXml
*/

function sendRequest(requestUrl,param,doAfterRequestMethodName,responseTypeName){
 createXMLHttpRequest(); 
 xmlHttp.open('POST',requestUrl,true);
 xmlHttp.setrequestheader("content-type","application/x-www-form-urlencoded");
 xmlHttp.onreadystatechange= function(){regCallBack(doAfterRequestMethodName,responseTypeName);};
 xmlHttp.send(param);
}

//回调函数
function regCallBack(doAfterRequestMethodName,responseTypeName){ 
 if(xmlHttp.readyState == 4){
  if(xmlHttp.status == 200){
         doAfterRequest(doAfterRequestMethodName,responseTypeName);
  }
 }
}

//请求成功后的执行函数
function doAfterRequest(doAfterRequestMethodName,responseTypeName){
 var responseString = "";
 if (responseTypeName!=null){
  if (responseTypeName == "responseText"){
   responseString = xmlHttp.responseText;
  }
  if (responseTypeName == "responseXml"){
   responseString = xmlHttp.responseXml;
  }
 } 
 if(doAfterRequestMethodName!=null){
  eval(doAfterRequestMethodName+"('"+responseString+"')");
 }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

struts-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "
http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd ">

<struts-config>
  <data-sources />
  <form-beans />
  <global-exceptions />
  <global-forwards />
  <action-mappings >
    <action path="/toStrutsAjaxTest" type="com.jgao.ajax.test.struts.action.ToStrutsAjaxTestAction">
 </action>
  </action-mappings>
  <message-resources parameter="com.yourcompany.struts.ApplicationResources" />
</struts-config>


ToStrutsAjaxTestAction.java

//Created by MyEclipse Struts
// XSL source (default): platform:/plugin/com.genuitec.eclipse.cross.easystruts.eclipse_4.1.0/xslt/JavaClass.xsl

package com.jgao.ajax.test.struts.action;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 * MyEclipse Struts
 * Creation date: 09-18-2006
 *
 * XDoclet definition:
 * @struts.action validate="true"
 */
public class ToStrutsAjaxTestAction extends Action {

 // --------------------------------------------------------- Instance Variables

 // --------------------------------------------------------- Methods

 /**
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  * @throws IOException
  */
 public ActionForward execute(
  ActionMapping mapping,
  ActionForm form,
  HttpServletRequest request,
  HttpServletResponse response) throws IOException {
  String teststring = request.getParameter("userName");
  teststring = teststring + "ok";
   response.getWriter().write(teststring);
  return null;
 }

}

posted @ 2006-09-19 10:11 JGAO编程随笔 阅读(968) | 评论 (1)编辑 收藏

java开发出错笔记.doc

     摘要: java 开发出错笔记 ---powered by jgao 1. ...  阅读全文

posted @ 2006-06-11 08:52 JGAO编程随笔 阅读(1377) | 评论 (0)编辑 收藏

jfreechart 学习笔记

1.java 2D主要绘图类描述(jdk1.5)
 Graphics2D //主要绘图对象,每种图形都要通过该对象来绘制
 Rectangle2D //长方形对象
 Point2D //点对象
 Line2D //线对象
 Arc2D.Double //弧形对象
 Ellipse2D //椭圆对象
 Polygon //多边形对象
 Paint //油漆桶对象,用来定义颜色
 Stroke //画笔对象,主要用于描绘轮廓,定义线条样式
 Area //几何建模对象(含几何并交差运算等方法)
 GeneralPath //路径对象
 
 1.1 sample demo eg:
  /**
   * 利用路径对象绘制平面图
   */
  // GeneralPath bar3dRight = new GeneralPath();
  // bar3dRight.moveTo((float) 100.0, (float) 100.0);
  // bar3dRight.lineTo((float) 200.0, (float) 200.0);
  // bar3dRight.lineTo((float) 300.0, (float) 100.0);
  // bar3dRight.lineTo((float) 100.0, (float) 100.0);
  // bar3dRight.closePath();
  // 填充四边形的颜色
  // if (itemPaint instanceof Color) {
  // g2.setPaint(((Color) itemPaint).darker());
  // }
  
  /**
   * 长方形对象加路径对象绘制3D柱状图
   */
  //正视图
  Rectangle2D r2d = new Rectangle2D.Double(
    100.0, //x
    100.0, //y
    30.0, //width
    200.0 //hight
    );
  //右视图
  GeneralPath bar3dRight = new GeneralPath();
  bar3dRight.moveTo((float) 130.0, (float) 100.0);
  bar3dRight.lineTo((float) 150.0, (float) 90.0);
  bar3dRight.lineTo((float) 150.0, (float) 290.0);
  bar3dRight.lineTo((float) 130.0, (float) 300.0);
  bar3dRight.closePath();
  //俯视图
  GeneralPath bar3dTop = new GeneralPath();
  bar3dTop.moveTo((float) 100.0, (float) 100.0);
  bar3dTop.lineTo((float) 130.0, (float) 100.0);
  bar3dTop.lineTo((float) 150.0, (float) 90.0);
  bar3dTop.lineTo((float) 120.0, (float) 90.0);
  bar3dTop.closePath();
  Paint barpaint = Color.PINK; // 实体颜色
  Paint outlinepaint = Color.DARK_GRAY; // 轮廓线颜色
  float dash1[] = { 10.0f };
  // 虚线条描边
  // Stroke stroke = new BasicStroke(1.0f,
  // BasicStroke.CAP_BUTT,
  // BasicStroke.JOIN_MITER,
  // 10.0f, dash1, 0.0f);
  
  // 实线条描边,宽度1.0f
  Stroke stroke = new BasicStroke(1.0f);
  // g2.setColor(Color.PINK);
  // 先设置实体颜色
  g2.setPaint(barpaint);
  g2.setStroke(stroke);
  g2.fill(r2d);
  g2.fill(bar3dRight);
  g2.fill(bar3dTop);
  // 实体填充进绘图对象以后,在设置轮廓线颜色(其实是上面三个实体以外的所有图形的颜色)
  g2.setPaint(outlinepaint);
  g2.draw(r2d);
  g2.draw(bar3dRight);
  g2.draw(bar3dTop);

  /**
   * 利用椭圆对象绘制椭圆
   */
  Ellipse2D ellipse2D = new Ellipse2D.Double(200.0, // x
    100.0, // y
    200.0, // width
    200.0 // hight
  );
  Paint ellipsepaint = Color.blue;
  g2.setPaint(ellipsepaint);
  g2.fill(ellipse2D);
  g2.draw(ellipse2D);

  /**
   * 利用弧形对象绘制弧形
   */
  Arc2D.Double arc = new Arc2D.Double(350.0, // x
    100.0, // y
    200.0, // width
    200.0, // hight
    0.0, // start angle
    90.0, // arc angle
    Arc2D.PIE // pie:3.1415926
  );
  Arc2D.Double arc2 = new Arc2D.Double(350.0, // x
    100.0, // y
    200.0, // width
    200.0, // hight
    -60.0, // start angle
    90.0, // arc angle
    Arc2D.PIE // pie:3.1415926
  );
  Paint arcpaint1 = Color.GREEN;
  Paint arcpaint2 = Color.RED;
  // 设置透明度
  g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
    0.3f));
  g2.setPaint(arcpaint1);
  g2.fill(arc);
  g2.draw(arc);
  g2.setPaint(arcpaint2);
  g2.fill(arc2);
  g2.draw(arc2);

  /**
   * 图形的几何运算
   */
  // Area a = new Area(arc);
  // Area b = new Area(arc2);
  // ab交差运算,去掉两个图形相交的部分得到的图形
  // a.exclusiveOr(b);
  // a交b运算
  // a.intersect(b);
  // a减去b运算,即差运算
  // a.subtract(b);
  // a并b运算
  // a.add(b);
  // g2.setPaint(arcpaint2);
  // g2.fill(a);
  // g2.draw(a);
  
  /**
   * 利用jfreechart的TextBox对象绘制文本框
   */
  // 设置透明度为1,也就是不透明了
  g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
    1.0f));
  TextBox textBox = new TextBox("java" // 想要显示的字符串
  );
  textBox.draw(g2, // 绘图对象
    (float) 550.0, // x坐标
    (float) 100.0, // y坐标
    RectangleAnchor.CENTER // 对齐方式
    );
  Line2D.Double line = new Line2D.Double(522.0, // 线的第一个点的x坐标
    100.0, // 线的第一个点的y坐标
    500.0, // 线的第二个点的x坐标
    120.0 // 线的第二个点的y坐标
  );
  g2.draw(line);

  /**
   * 写字
   */
  // 字体设置
  Font font = new Font(null, // 字体
    Font.ITALIC + Font.BOLD, // 样式(这里设置了两种样式,黑体+斜体)
    10); // 大小
  g2.setFont(font);
  Paint arcpaint3 = Color.BLACK;
  g2.setPaint(arcpaint3);
  g2.drawString("delphi", // 要写的字符串
    550, // x坐标
    150 // y坐标
    );
    
   /**
   * 利用多边形对象绘制多边形
   */
  int []xs = new int[] { 600, 620,
    640, 620 };
  int []ys = new int[] { 100,
    100, 150,
    150};   
  Polygon polygon = new Polygon(
    xs, //多边形x坐标点的数组
    ys, //多边形y坐标点的数组
    4 //数组大小
    );
  g2.setPaint(java.awt.Color.lightGray);
  g2.fill(polygon);
  g2.draw(polygon);
  
  /**
   * 画网格线
   */ 
  for(double i=0.0; i<450.0; i+=30.0){
   // 网格线样式
      Stroke DEFAULT_GRIDLINE_STROKE = new BasicStroke(0.5f,
              BasicStroke.CAP_BUTT,
              BasicStroke.JOIN_BEVEL,
              0.0f,
              new float[] {2.0f, 2.0f},
              0.0f);
      Line2D.Double gridline = new Line2D.Double(0.0,i+30.0,700.0,i+30.0);
      g2.setPaint(Color.GRAY);
      g2.setStroke(DEFAULT_GRIDLINE_STROKE);
      g2.draw(gridline);
  }


2.柱状图2D和3D是通过CategoryPlot的renderer属性来区别的
 BarRenderer //2DBarRenderer
 BarRenderer3D //3DBarRenderer
 CategoryPlot plot = new CategoryPlot(
            dataset, categoryAxis, valueAxis, renderer
        );

3.3D饼图的绘制函数(现在的注释还不够全面,也可能存在错误)
 /**
  * Draws the plot on a Java 2D graphics device (such as the screen or a
  * printer). This method is called by the {@link org.jfree.chart.JFreeChart}
  * class, you don't normally need to call it yourself.
  *
  * @param g2
  *            the graphics device.
  * @param plotArea
  *            the area within which the plot should be drawn.
  * @param anchor
  *            the anchor point.
  * @param parentState
  *            the state from the parent plot, if there is one.
  * @param info
  *            collects info about the drawing (<code>null</code>
  *            permitted).
  */
 public void draw(Graphics2D g2, Rectangle2D plotArea, Point2D anchor,
   PlotState parentState, PlotRenderingInfo info) {

  // adjust for insets...
  RectangleInsets insets = getInsets();
  insets.trim(plotArea);

  Rectangle2D originalPlotArea = (Rectangle2D) plotArea.clone();
  if (info != null) {
   info.setPlotArea(plotArea);
   info.setDataArea(plotArea);
  }

  Shape savedClip = g2.getClip();
  g2.clip(plotArea);

  // adjust the plot area by the interior spacing value
  double gapPercent = getInteriorGap();
  double labelPercent = 0.0;
  if (getLabelGenerator() != null) {
   labelPercent = getLabelGap() + getMaximumLabelWidth()
     + getLabelLinkMargin();
  }

  // 水平方向的间隙
  double gapHorizontal = plotArea.getWidth()
    * (gapPercent + labelPercent);
  // 垂直方向的间隙
  double gapVertical = plotArea.getHeight() * gapPercent;
  // x坐标大小
  double linkX = plotArea.getX() + gapHorizontal / 2;
  // y坐标大小
  double linkY = plotArea.getY() + gapVertical / 2;
  // 图形宽度
  double linkW = plotArea.getWidth() - gapHorizontal;
  // 图形高度
  double linkH = plotArea.getHeight() - gapVertical;

  // make the link area a square if the pie chart is to be circular...
  if (isCircular()) { // is circular?
   double min = Math.min(linkW, linkH) / 2;
   linkX = (linkX + linkX + linkW) / 2 - min;
   linkY = (linkY + linkY + linkH) / 2 - min;
   linkW = 2 * min;
   linkH = 2 * min;
  }

  PiePlotState state = initialise(g2, plotArea, this, null, info);
  // the explode area defines the max circle/ellipse for the exploded pie
  // sections.
  // it is defined by shrinking the linkArea by the linkMargin factor.
  double hh = linkW * getLabelLinkMargin();
  double vv = linkH * getLabelLinkMargin();
  Rectangle2D explodeArea = new Rectangle2D.Double(linkX + hh / 2.0,
    linkY + vv / 2.0, linkW - hh, linkH - vv);

  state.setExplodedPieArea(explodeArea);

  // the pie area defines the circle/ellipse for regular pie sections.
  // it is defined by shrinking the explodeArea by the explodeMargin
  // factor.
  double maximumExplodePercent = getMaximumExplodePercent();
  double percent = maximumExplodePercent / (1.0 + maximumExplodePercent);

  double h1 = explodeArea.getWidth() * percent;
  double v1 = explodeArea.getHeight() * percent;
  Rectangle2D pieArea = new Rectangle2D.Double(explodeArea.getX() + h1
    / 2.0, explodeArea.getY() + v1 / 2.0, explodeArea.getWidth()
    - h1, explodeArea.getHeight() - v1);

  // 定义3D椭圆的高度
  int depth = (int) (pieArea.getHeight() * this.depthFactor);
  // the link area defines the dog-leg point for the linking lines to
  // the labels
  Rectangle2D linkArea = new Rectangle2D.Double(linkX, linkY, linkW,
    linkH - depth);
  state.setLinkArea(linkArea);

  state.setPieArea(pieArea);
  // 定义椭圆中心点
  state.setPieCenterX(pieArea.getCenterX());
  state.setPieCenterY(pieArea.getCenterY() - depth / 2.0);
  // 定义椭圆宽的半径
  state.setPieWRadius(pieArea.getWidth() / 2.0);
  // 定义椭圆高的半径
  state.setPieHRadius((pieArea.getHeight() - depth) / 2.0);
  // 画背景长方形(500*300)区域
  drawBackground(g2, plotArea);
  // 获取外面传进来3D饼图的数据源
  PieDataset dataset = getDataset();  
  // 如果数据源为空则直接返回,整个图表就一个背景长方形没有数据图形
  if (DatasetUtilities.isEmptyOrNull(getDataset())) {
   drawNoDataMessage(g2, plotArea);
   g2.setClip(savedClip);
   drawOutline(g2, plotArea);
   return;
  }

  /**
   * 如果数据源的主键的个数大于图形区域的宽度,则在图形上显示"Too many elements" 数据源示例如下: final
   * DefaultPieDataset result = new DefaultPieDataset();
   * result.setValue("Java", new Double(43.2));
   * result.setValue("VisualBasic", new Double(10.0));
   * result.setValue("C/C++", new Double(17.5));
   * result.setValue("PHP", new Double(32.5));
   * result.setValue("Perl", new Double(1.0));
   * return result;
   * 这个数据源的主键的个数为5
   */
  if (dataset.getKeys().size() > plotArea.getWidth()) {
   String text = "Too many elements";
   Font sfont = new Font("dialog", Font.BOLD, 10);
   g2.setFont(sfont);
   FontMetrics fm = g2.getFontMetrics(sfont);
   int stringWidth = fm.stringWidth(text);

   g2
     .drawString(text, (int) (plotArea.getX() + (plotArea
       .getWidth() - stringWidth) / 2), (int) (plotArea
       .getY() + (plotArea.getHeight() / 2)));
   return;
  }
  
  // if we are drawing a perfect circle, we need to readjust the top left
  // coordinates of the drawing area for the arcs to arrive at this
  // effect.
  // 如果我们画的是一个圆形那只要知道图形的左边距,上边距,和直径
  if (isCircular()) {
   // 圆形半径(取宽高中的小的那个数的一半)
   double min = Math.min(plotArea.getWidth(), plotArea.getHeight()) / 2;
   plotArea = new Rectangle2D.Double(
     plotArea.getCenterX() - min, //左边距(新的图形的中心点x坐标)
     plotArea.getCenterY() - min, //上边距(新的图形的中心点y坐标)
     2 * min, //直径(图形的宽度)
     2 * min //直径(图形的高度)
     );
  }
  
  // 获取数据源主键列表
  List sectionKeys = dataset.getKeys();
  // 如果数据源主键列表为空,退出
  if (sectionKeys.size() == 0) {
   return;
  }

  // establish the coordinates of the top left corner of the drawing area
  //确定pieArea区域的中心点
  double arcX = pieArea.getX();
  double arcY = pieArea.getY();

  // g2.clip(clipArea);
  Composite originalComposite = g2.getComposite();
  g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
    getForegroundAlpha()));
  
  //把数据源每个主键对应的值加起来
  double totalValue = DatasetUtilities.calculatePieDatasetTotal(dataset);
  
  //遍历列表的时候用到
  double runningTotal = 0;
  
  //如果高度<0退出
  if (depth < 0) {
   return; // if depth is negative don't draw anything
  }

  //弧形的列表(用于添加主键的值对应的弧形)
  ArrayList arcList = new ArrayList();
  //定义一个弧行
  Arc2D.Double arc;
  //定义油漆桶,用来填充颜色
  Paint paint;
  Paint outlinePaint;
  //用于描绘轮廓的样式
  Stroke outlineStroke;
  
  //遍历取出主键的值对应的弧形放到弧形列表
  Iterator iterator = sectionKeys.iterator();
  while (iterator.hasNext()) {
   // 取出主键的值
   Comparable currentKey = (Comparable) iterator.next();   
   Number dataValue = dataset.getValue(currentKey);
   
   // 如果主键的值为空,则弧形为空
   if (dataValue == null) {
    arcList.add(null);
    continue;
   }
   
   // 如果主键的值<=0,则弧形为空
   double value = dataValue.doubleValue();
   if (value <= 0) {
    arcList.add(null);
    continue;
   }
   
   //弧形的开始角度(从该角度算起,相当于360度的0度)
   double startAngle = getStartAngle();
   //方向
   double direction = getDirection().getFactor();
   //角度大小1(该主键对应的弧形的开始角度)
   double angle1 = startAngle + (direction * (runningTotal * 360))
     / totalValue;
   //角度大小2(该主键对应的弧形的结束角度)
   double angle2 = startAngle
     + (direction * (runningTotal + value) * 360) / totalValue;
   
   //如果弧形的角度大小<0.00001则该弧形为空
   if (Math.abs(angle2 - angle1) > getMinimumArcAngleToDraw()) {
    arcList.add(new Arc2D.Double(arcX, arcY + depth, pieArea
      .getWidth(), pieArea.getHeight() - depth, angle1,
      angle2 - angle1, Arc2D.PIE));
   } else {
    arcList.add(null);
   }
   
   //转入下个弧形(主键对应的图形)
   runningTotal += value;
  }
  
  //取出剪裁的图形(500*300)
  Shape oldClip = g2.getClip();

  //3D饼图中上面的椭圆
  Ellipse2D top = new Ellipse2D.Double(pieArea.getX(), pieArea.getY(),
    pieArea.getWidth(), pieArea.getHeight() - depth);
  // 3D饼图中底部的椭圆
  Ellipse2D bottom = new Ellipse2D.Double(pieArea.getX(), pieArea.getY()
    + depth, pieArea.getWidth(), pieArea.getHeight() - depth);  
  //底部的长方形
  Rectangle2D lower = new Rectangle2D.Double(top.getX(),
    top.getCenterY(), pieArea.getWidth(), bottom.getMaxY()
      - top.getCenterY());
  //上部的长方形
  Rectangle2D upper = new Rectangle2D.Double(pieArea.getX(), top.getY(),
    pieArea.getWidth(), bottom.getCenterY() - top.getY());
  
  // Area几何建模对象
  Area a = new Area(top);
  a.add(new Area(lower));
  Area b = new Area(bottom);
  b.add(new Area(upper));
  Area pie = new Area(a);
  // 通过几何建模对象对上面的图形进行交叉运算
  pie.intersect(b);

  Area front = new Area(pie);
  // 相减运算
  front.subtract(new Area(top));

  Area back = new Area(pie);
  // 相减运算
  back.subtract(new Area(bottom));

  // draw the bottom circle
  int[] xs;
  int[] ys;
  outlinePaint = getSectionOutlinePaint(0);
  arc = new Arc2D.Double(arcX, arcY + depth, pieArea.getWidth(), pieArea
    .getHeight()
    - depth, 0, 360, Arc2D.PIE);

  // 画出3D饼图下部的椭圆的弧形和有该图形的高度组成的多边形
  int categoryCount = arcList.size();
  for (int categoryIndex = 0; categoryIndex < categoryCount; categoryIndex++) {
   //取出弧形
   arc = (Arc2D.Double) arcList.get(categoryIndex);
   if (arc == null) {
    continue;
   }
   paint = getSectionPaint(categoryIndex);
   outlinePaint = getSectionOutlinePaint(categoryIndex);
   outlineStroke = getSectionOutlineStroke(categoryIndex);
   g2.setPaint(paint);
   //填充弧形
   g2.fill(arc);
   g2.setPaint(outlinePaint);
   g2.setStroke(outlineStroke);
   //绘制弧形
   g2.draw(arc);
   g2.setPaint(paint);
   
   //取得弧形的开始点
   Point2D p1 = arc.getStartPoint();

   // 定义多边形(弧形的高度组成的图形)
   xs = new int[] { (int) arc.getCenterX(), (int) arc.getCenterX(),
     (int) p1.getX(), (int) p1.getX() };
   ys = new int[] { (int) arc.getCenterY(),
     (int) arc.getCenterY() - depth, (int) p1.getY() - depth,
     (int) p1.getY() };   
   Polygon polygon = new Polygon(
     xs, //多边形x坐标点的数组
     ys, //多边形y坐标点的数组
     4 //数组大小
     );
   g2.setPaint(java.awt.Color.lightGray);
   g2.fill(polygon);
   g2.setPaint(outlinePaint);
   g2.setStroke(outlineStroke);
   //绘制该多边形
   g2.draw(polygon);
   g2.setPaint(paint);

  }

  g2.setPaint(Color.gray);
  g2.fill(back);
  g2.fill(front);

  // cycle through once drawing only the sides at the back...
  // 描出背部的边
  int cat = 0;
  iterator = arcList.iterator();
  while (iterator.hasNext()) {
   Arc2D segment = (Arc2D) iterator.next();
   if (segment != null) {
    paint = getSectionPaint(cat);
    outlinePaint = getSectionOutlinePaint(cat);
    outlineStroke = getSectionOutlineStroke(cat);
    drawSide(g2, pieArea, segment, front, back, paint,
      outlinePaint, outlineStroke, false, true);
   }
   cat++;
  }

  // cycle through again drawing only the sides at the front...
  // 描出前面的边
  cat = 0;
  iterator = arcList.iterator();
  while (iterator.hasNext()) {
   Arc2D segment = (Arc2D) iterator.next();
   if (segment != null) {
    paint = getSectionPaint(cat);
    outlinePaint = getSectionOutlinePaint(cat);
    outlineStroke = getSectionOutlineStroke(cat);
    drawSide(g2, pieArea, segment, front, back, paint,
      outlinePaint, outlineStroke, true, false);
   }
   cat++;
  }

  g2.setClip(oldClip);

  // 画出3D饼图上部的椭圆的弧形和相关的标签链接和底部的说明(tooltip)
  Arc2D upperArc;
  for (int sectionIndex = 0; sectionIndex < categoryCount; sectionIndex++) {
   //取出弧形
   arc = (Arc2D.Double) arcList.get(sectionIndex);
   if (arc == null) {
    continue;
   }
   //定义3D饼图上部的椭圆的弧形
   upperArc = new Arc2D.Double(arcX, arcY, pieArea.getWidth(), pieArea
     .getHeight()
     - depth,
     arc.getAngleStart(), //开始角度
     arc.getAngleExtent(), //角度大小
     Arc2D.PIE);
   //g2图形对象所需的油漆桶
   paint = getSectionPaint(sectionIndex);
   //g2图形对象所需的轮廓油漆桶
   outlinePaint = getSectionOutlinePaint(sectionIndex);
   //g2图形对象所需的轮廓样式
   outlineStroke = getSectionOutlineStroke(sectionIndex);
   g2.setPaint(paint);
   //往g2图形对象中填充弧形
   g2.fill(upperArc);
   g2.setStroke(outlineStroke);
   g2.setPaint(outlinePaint);
   //绘制弧形
   g2.draw(upperArc);

   // 为该部分弧形添加说明栏(tooltip)和url链接
   Comparable currentKey = (Comparable) sectionKeys.get(sectionIndex);
   if (info != null) {
    EntityCollection entities = info.getOwner()
      .getEntityCollection();
    if (entities != null) {
     String tip = null;
     PieToolTipGenerator tipster = getToolTipGenerator();
     if (tipster != null) {
      // @mgs: using the method's return value was missing
      tip = tipster.generateToolTip(dataset, currentKey);
     }
     String url = null;
     if (getURLGenerator() != null) {
      url = getURLGenerator().generateURL(dataset,
        currentKey, getPieIndex());
     }
     PieSectionEntity entity = new PieSectionEntity(upperArc,
       dataset, getPieIndex(), sectionIndex, currentKey,
       tip, url);
     entities.add(entity);
    }
   }
   
   List keys = dataset.getKeys();
   //绘制标签的长方形
   Rectangle2D adjustedPlotArea = new Rectangle2D.Double(
     originalPlotArea.getX(), originalPlotArea.getY(),
     originalPlotArea.getWidth(), originalPlotArea.getHeight()
       - depth);
   //绘制标签(如:Perl=1的Textbox)
   drawLabels(g2, keys, totalValue, adjustedPlotArea, linkArea, state);
  }

  g2.setClip(savedClip);
  g2.setComposite(originalComposite);
  //绘制轮廓
  drawOutline(g2, originalPlotArea);
 }
 
4.3D柱状图的绘制函数(现在的注释还不够全面,也可能存在错误)
    /**
     * Draws a 3D bar to represent one data item.
     *
     * @param g2  the graphics device.
     * @param state  the renderer state.
     * @param dataArea  the area for plotting the data.
     * @param plot  the plot.
     * @param domainAxis  the domain axis.
     * @param rangeAxis  the range axis.
     * @param dataset  the dataset.
     * @param row  the row index (zero-based).
     * @param column  the column index (zero-based).
     * @param pass  the pass index.
     */
    public void drawItem(Graphics2D g2,
                         CategoryItemRendererState state,
                         Rectangle2D dataArea,
                         CategoryPlot plot,
                         CategoryAxis domainAxis,
                         ValueAxis rangeAxis,
                         CategoryDataset dataset,
                         int row,
                         int column,
                         int pass) {
   
        // check the value we are plotting...
        Number dataValue = dataset.getValue(row, column);
        if (dataValue == null) {
            return;
        }
       
        double value = dataValue.doubleValue();
       
        Rectangle2D adjusted = new Rectangle2D.Double(
            dataArea.getX(),
            dataArea.getY() + getYOffset(),
            dataArea.getWidth() - getXOffset(),
            dataArea.getHeight() - getYOffset()
        );

        PlotOrientation orientation = plot.getOrientation();
       
        double barW0 = calculateBarW0(
            plot, orientation, adjusted, domainAxis, state, row, column
        );
        double[] barL0L1 = calculateBarL0L1(value);
        if (barL0L1 == null) {
            return;  // the bar is not visible
        }

        RectangleEdge edge = plot.getRangeAxisEdge();
        double transL0 = rangeAxis.valueToJava2D(barL0L1[0], adjusted, edge);
        double transL1 = rangeAxis.valueToJava2D(barL0L1[1], adjusted, edge);
        double barL0 = Math.min(transL0, transL1);
        double barLength = Math.abs(transL1 - transL0);
       
        // draw the bar...
        //柱子的正视图
        Rectangle2D bar = null;
        if (orientation == PlotOrientation.HORIZONTAL) {
            bar = new Rectangle2D.Double(
                barL0, barW0, barLength, state.getBarWidth()
            );
        }
        else {
            bar = new Rectangle2D.Double(
                barW0, barL0, state.getBarWidth(), barLength
            );
        }
        Paint itemPaint = getItemPaint(row, column);
        g2.setPaint(itemPaint);
        g2.fill(bar);

        // 柱子的俯视图上的四个点的x坐标值
        double x0 = bar.getMinX();
        double x1 = x0 + getXOffset(); //x0+12
        double x2 = bar.getMaxX();
        double x3 = x2 + getXOffset(); //x2+12
        // 柱子的右视图上的四个点的y坐标值
        double y0 = bar.getMinY() - getYOffset(); //正视图的最小y值-8
        double y1 = bar.getMinY();
        double y2 = bar.getMaxY() - getYOffset(); //正视图的最大y值-8
        double y3 = bar.getMaxY();
       
        GeneralPath bar3dRight = null;
        GeneralPath bar3dTop = null;
        // 柱子的右视图
        if (barLength > 0.0) {
            bar3dRight = new GeneralPath();
            bar3dRight.moveTo((float) x2, (float) y3);
            bar3dRight.lineTo((float) x2, (float) y1);
            bar3dRight.lineTo((float) x3, (float) y0);
            bar3dRight.lineTo((float) x3, (float) y2);
            bar3dRight.closePath();

            if (itemPaint instanceof Color) {
                g2.setPaint(((Color) itemPaint).darker());
            }
            g2.fill(bar3dRight);
        }
        // 柱子的俯视图
        bar3dTop = new GeneralPath();
        bar3dTop.moveTo((float) x0, (float) y1);
        bar3dTop.lineTo((float) x1, (float) y0);
        bar3dTop.lineTo((float) x3, (float) y0);
        bar3dTop.lineTo((float) x2, (float) y1);
        bar3dTop.closePath();
        g2.fill(bar3dTop);

        //绘制3D柱状图
        if (isDrawBarOutline()
                && state.getBarWidth() > BAR_OUTLINE_WIDTH_THRESHOLD) {
            g2.setStroke(getItemOutlineStroke(row, column));
            g2.setPaint(getItemOutlinePaint(row, column));
            g2.draw(bar);
            if (bar3dRight != null) {
                g2.draw(bar3dRight);
            }
            if (bar3dTop != null) {
                g2.draw(bar3dTop);
            }
        }

        //绘制标签
        CategoryItemLabelGenerator generator
            = getItemLabelGenerator(row, column);
        if (generator != null && isItemLabelVisible(row, column)) {
            drawItemLabel(
                g2, dataset, row, column, plot, generator, bar, (value < 0.0)
            );
        }       

        // add an item entity, if this information is being collected
        EntityCollection entities = state.getEntityCollection();
        if (entities != null) {
            GeneralPath barOutline = new GeneralPath();
            barOutline.moveTo((float) x0, (float) y3);
            barOutline.lineTo((float) x0, (float) y1);
            barOutline.lineTo((float) x1, (float) y0);
            barOutline.lineTo((float) x3, (float) y0);
            barOutline.lineTo((float) x3, (float) y2);
            barOutline.lineTo((float) x2, (float) y3);
            barOutline.closePath();
            addItemEntity(entities, dataset, row, column, barOutline);
        }

    }

posted @ 2006-05-12 15:22 JGAO编程随笔 阅读(1471) | 评论 (0)编辑 收藏

<2006年5月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿(1)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜