原创 js 屏蔽IE刷新

2010年8月3日 懒猫 没有评论

   以下代码是如何利用javascript 实现屏蔽F5,BackSpace,IE的刷新,右键,退格键。

    屏蔽F10、F11、   能支持IE 和 火狐,

阅读全文…

原创 GridPanel动态列

2010年7月13日 懒猫 3 条评论

     动态列的实现,关键点在于怎么在后台传送数据到前台,在前台如何去组装数据,组装列模型。在加载列数据的时候,是通过Ajax异步处理,那就是要先加载列头,然后再加载列值数据。那我们可以通过两个请求分别处理列头和列值,一个请求用来,从数据库将所有的列头信息返回。一个请求用来获得列值数据。得到的列头的信息也是通过Ajax返回到前台。

     阅读全文…

原创 Ext.form.formPanel 与服务器交互 初始化表单

2010年7月9日 懒猫 2 条评论

    formPanel 初始化表单有两种方式加载,一种是本地加载,一种是通过返回回来的Json格式数据加载到表单里面。
得到表单来加载数据的时候,必须用form.getForm(), 得到basicForm()这个对象,formPanel是继承自basciForm()
本地加载通过form.getForm.loadRecord() 加载,传入的一个记录集(new Ext.data.record.create())。 根据相应的映射会自动匹配到表单的每个文本框。
   比如,通过点击表格的编辑事件,得到表格记录的行数据。
var updateGrid = Ext.getCmp(“displayEmpGrid”);
var rows = updateGrid.getSelectionModel().getSelections();
if (rows) {
//for (var i = 0; i < rows.length; i++) {
alert(rows[0].imageUpload);
form.getForm().loadRecord(rows[0]); //将数据集加载到表单中,直接获取表格的数据
Ext.get(‘imageBrowse’).dom.src = “images/anniubg.gif”;
//}
}
   但是将所有的数据放到页面,然后从页面这样子加载,不太推荐,加载所有的数据到页面会加重页面负担。。

   远程加载是通过 form.getForm().load()加载。
// 解析后台返回的数据
form.getForm().reader = empReader;

// 从后台加载json格式数据
form.getForm().load({
url : “employee_selectByPrimaryEmployee.action”,     
method : “POST”,
params : {
empNo : empNo //参数
}
});

var empReader = new Ext.data.JsonReader              //解析Json格式数据。({                                                                                                                                                                                                                                                  

  name:”empNo “,

 mapping:”empNo”      //为json数据里面 对应的属性值 

},{name:”empName”, mapping:”empName”});

//json数据,即action中 selectByPrimaryEmployee 所要返回到页面的json数据格式 

var  json = [{empNo:"111",empName:"小王"}];

    printwrite.print(json);   //将数据返回到前台

   这样子就是通过将服务器数据加载到表单显示。一定要注意,加载本地和加载远程不要用错方法了,加载远程是用load(),里面传的url。 本地用 加载用loadRecord(),直接传入一个记录集,就可以加载进去。

分类: java日记 标签:

原创 Extjs 上传图片预览显示

2010年6月30日 懒猫 1 条评论

var fileForm = new Ext.form.FormPanel({
title : “”,
renderTo : “fileUpload”,
fileUpload : true,
layout : “form”,
id : “fileUploadForm”,
items : [{
id : ‘upload’,
name : ‘upload’,
inputType : “file”,
fieldLabel : ‘上传图片’,
xtype : ‘textfield’,
anchor : ‘40%’

阅读全文…

原创 Extjs + struts2 上传文件

2010年6月29日 懒猫 没有评论

     昨天一直在弄文件上传,之前没有太明白是文件上传是怎么回事,今天试验成功了,也有点了解了。也就是将本地文件通过http文件写入到服务器,通俗的讲就要上传就是直接文件将文件从一个位置拷贝一份到另外一个地方,而另外一个地方指的就是在服务器里面的一个文件里面。那就只要先获得目标文件的路径,wap下面的存文件的文件夹路径。然后再通过流输入到指定文件里面。

js 代码
Ext.onReady(function() {
var fileForm = new Ext.form.FormPanel({
title : “”,
renderTo : “fileUpload”,
fileUpload : true,
layout : “form”,
id : “fileUploadForm”,
items : [{
id : 'upload',
name : 'upload',
fieldLabel : "选择",
inputType : "file",
xtype : "field"
}],

buttons : [{
text : "提交",
name : "submit",
handler : submit
}]
});

});

function submit() {
Ext.getCmp(“fileUploadForm”).getForm().submit({

url : “uploadAction.action”,
method : “POST”,
success : function(form, action) {
alert(“success”);
},
failure : function(form, action) {
alert(“failure”);
}
});
}

action代码

package com.cocobra.action;

import java.io.*;
import java.util.Date;
import java.util.UUID;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {

 /**
  *
  */
 private static final long serialVersionUID = 1L;
 private File upload;
 private String uploadContentType;
 //这里要注意一点,uploadFileName 中的 upload 要与传入过来的File名字一样,不然获取不到文件的名字,今天就因为这里不一致,找了一上午没找到原因
 private String uploadFileName;
 
 public File getUpload() {
  return upload;
 }

 public void setUpload(File upload) {
  this.upload = upload;
 }

 public String getUploadContentType() {
  return uploadContentType;
 }

 public void setUploadContentType(String uploadContentType) {
  this.uploadContentType = uploadContentType;
 }

 public String getUploadFileName() {
  return uploadFileName;
 }

 public void setUploadFileName(String uploadFileName) {
  this.uploadFileName = uploadFileName;
 }

 // 上传文件的文件名
 

// private String getFileExp(String name) {
//  int pos = name.lastIndexOf(“.”);
//
//  return name.substring(pos);
// }
 
 private static final int BUFFER_SIZE = 16 * 1024;
 
 public String execute() throws Exception{
 
  Date d = new Date();
  
  System.out.println(“uploadFileName = “+this.uploadFileName);  //要上传的文件名
  

//获得wapps的路径,uploader 指的放在文件的地方
  String toSrc = ServletActionContext.getServletContext().getRealPath(“uploader”)+”/”+uploadFileName;
 
  System.out.println(“toFile= “+toSrc);
  
  File toFile = new File(toSrc);
 
  
  writeFile(this.upload,toFile);
  
  return SUCCESS;
 }
 private static void writeFile(File src, File dst) {
  
  System.out.println(” == 文件寫入 == “);
  try {
   InputStream in = null;
   OutputStream out = null;
   try {
   
    in = new BufferedInputStream(new FileInputStream(src),   //获得要上传的文件
      BUFFER_SIZE);
    out = new BufferedOutputStream(new FileOutputStream(dst),  //指定要上传到的位置
      BUFFER_SIZE);
    byte[] buffer = new byte[BUFFER_SIZE];    

//开始写入
    while (in.read(buffer) > 0) {
     out.write(buffer);
    }
   } finally {
    if (null != in) {
     in.close();
    }
    if (null != out) {
     out.close();
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  
  System.out.println(“写入成功!”);
}
}

//struts2.xml 配置文件一段

<action name=”uploadAction” >
       <interceptor-ref name=”fileUpload”>
       <!–拦截器strut2自带的, 指定上传文件的格式,如果不符合规定,将会自动拦截下来 –>
    <param name=”allowedTypes”>image/bmp,image/png,image/gif,image/jpeg,image/jpg</param>
    <param name=”maximumSize”>20000000000</param>
   </interceptor-ref>
      <interceptor-ref name=”defaultStack” />
      <result name =”success” >/index.jsp</result >
  </action>

原创 MyEclipse7.5注册码 序列号 Java版注册机源代码

2010年6月25日 懒猫 没有评论

    下载 MyEclipse7.5后执行以下操作:

   1、建立java Project,任意取个名字就行。

   2、建立一个名字为MyEclipseGen的类文件,内容见附件。

   3、运行该代码,在控制台中会出现:

   please input register name:

   ×××××(你的name)

   即生成序列号:

   4、进入myeclipse,输入Subscriber和Subscription code即可。

   附件:

   import java.io.BufferedReader;

   import java.io.IOException;

   import java.io.InputStreamReader;

   public class MyEclipseGen {

   private static final String LL = “Decompiling this copyrighted software is a violation of both your license agreement and the Digital Millenium Copyright Act of 1998 (http://www.loc.gov/copyright/legislation/dmca.pdf). Under section 1204 of the DMCA, penalties range up to a $500,000 fine or up to five years imprisonment for a first offense. Think about it; pay for a license, avoid prosecution, and feel better about yourself.”;

   public String getSerial(String userId, String licenseNum) {

   java.util.Calendar cal = java.util.Calendar.getInstance();

   cal.add(1, 3);

   cal.add(6, -1);

   java.text.NumberFormat nf = new java.text.DecimalFormat(“000″);

   licenseNum = nf.format(Integer.valueOf(licenseNum));

   String verTime = new StringBuilder(“-”).append(

   new java.text.SimpleDateFormat(“yyMMdd”).format(cal.getTime())).append(“0″).toString();

String type = “YE3MP-”;

String need = new StringBuilder(userId.substring(0, 1)).append(type)

.append(“300″).append(licenseNum).append(verTime).toString();

String dx = new StringBuilder(need).append(LL).append(userId)

.toString();

int suf = this.decode(dx);

String code = new StringBuilder(need).append(String.valueOf(suf))

.toString();

return this.change(code);

}

private int decode(String s) {

int i;

char[] ac;

int j;

int k;

i = 0;

ac = s.toCharArray();

j = 0;

k = ac.length;

while (j < k) {

i = (31 * i) + ac[j];

j++;

}

return Math.abs(i);

}

private String change(String s) {

byte[] abyte0;

char[] ac;

int i;

int k;

int j;

abyte0 = s.getBytes();

ac = new char[s.length()];

i = 0;

k = abyte0.length;

while (i = 48) && (j = 65) && (j = 97) && (j <= 122)) {

j = (((j – 97) + 13) % 26) + 97;

}

ac[i] = (char) j;

i++;

}

return String.valueOf(ac);

}

public MyEclipseGen() {

super();

}

public static void main(String[] args) {

try {

System.out.println(“please input register name:”);

BufferedReader reader = new BufferedReader(new InputStreamReader(

System.in));

String userId = null;

userId = reader.readLine();

MyEclipseGen myeclipsegen = new MyEclipseGen();

String res = myeclipsegen.getSerial(userId, “5″);

System.out.println(“Serial:” + res);

reader.readLine();

} catch (IOException ex) {

}

}

}

我运行后的结果:

please input register name:

selina

Serial:fLR8ZC-855550-6851795814938907

注:private static final String LL = “Decompiling this copyrighted software is a violation of both your license agreement and the Digital Millenium Copyright Act of 1998 (http://www.loc.gov/copyright/legislation/dmca.pdf). Under section 1204 of the DMCA, penalties range up to a $500,000 fine or up to five years imprisonment for a first offense. Think about it; pay for a license, avoid prosecution, and feel better about yourself.”;

此段代码常量不可变更 否则注册码无效

可以用到2013年6月24日哟。。

原创 Json工具类

2010年6月25日 懒猫 没有评论

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.math.BigDecimal;
import java.math.BigInteger;
import javax.servlet.http.HttpServletRequest;
import net.sf.json.JSONObject;

/** *//**
 * @author
 *
 */
public class JsonUtil{
 /**
  * 读取请求参数转换JSONObject对象
  *
  * @param request HttpServletRequest 对象
  * @return json格式的String对象
  * @throws Exception
  */
 @SuppressWarnings(“unchecked”)
 public static JSONObject readJson(HttpServletRequest request) throws Exception {
  JSONObject jsonObject = new JSONObject();
  try {
   Map parameterMap = request.getParameterMap();
                 // 通过循环遍历的方式获得key和value并set到JSONObject中
   Iterator paIter = parameterMap.keySet().iterator();
   while (paIter.hasNext()) {
    String key = paIter.next().toString();
    String[] values = (String[])parameterMap.get(key);
    jsonObject.accumulate(key, values[0]);
   }
  } catch (Exception e) {
   e.printStackTrace();
   throw e;
  }
  return jsonObject;
 }
 
 public static String getData(List<?> list,int index,int pageSize,Object obj){
       String json = “{total:”+list.size()+”,root:[";
       for (int i = index; i < pageSize + index && i<list.size(); i++) {
       obj = (Object)list.get(i);
           json += object2json(obj);
           if (i != pageSize + index - 1 && i != list.size()-1) {
               json += ",";
           }
       }
       json += "]}”;
       return json;
 }

 public static String getData2(List<?> list,int index,int pageSize,Object obj){
      String json = “{flag:”+”a”+”,root:[";
      for (int i = index; i < pageSize + index && i<list.size(); i++) {
      obj = (Object)list.get(i);
          json += object2json(obj);
          if (i != pageSize + index - 1 && i != list.size()-1) {
              json += ",";
          }
      }
      json += "]}”;
      return json;
 }
 
 public static String object2json(Object obj) {
     StringBuilder json = new StringBuilder();
     if (obj == null) {
       json.append(“\”\”");
     } else if (obj instanceof String ||
          obj instanceof Integer ||
          obj instanceof Float ||
          obj instanceof Boolean ||
          obj instanceof Short ||
          obj instanceof Double ||
          obj instanceof Long ||
          obj instanceof BigDecimal ||
          obj instanceof BigInteger ||
          obj instanceof Byte) {
       json.append(“\”").append(string2json(obj.toString())).append(“\”");
     } else if (obj instanceof Object[]) {
       json.append(array2json((Object[]) obj));
     } else if (obj instanceof List) {
       json.append(list2json((List<?>) obj));
     } else if (obj instanceof Map) {
       json.append(map2json((Map<?, ?>) obj));
     } else if (obj instanceof Set) {
       json.append(set2json((Set<?>) obj));
     } else {
       json.append(bean2json(obj));
     }
     return json.toString();
 }

   
 public static String bean2json(Object bean) {
     StringBuilder json = new StringBuilder();
     json.append(“{“);
     PropertyDescriptor[] props = null;
     try {
       props = Introspector.getBeanInfo(bean.getClass(), Object.class).getPropertyDescriptors();
     } catch (IntrospectionException e) {}
     if (props != null) {
       for (int i = 0; i < props.length; i++) {
         try {
           String name = object2json(props[i].getName());
           String value = object2json(props[i].getReadMethod().invoke(bean));
           json.append(name);
           json.append(“:”);
           json.append(value);
           json.append(“,”);
         } catch (Exception e) {}
       }
       json.setCharAt(json.length() – 1, ‘}’);
     } else {
       json.append(“}”);
     }
     return json.toString();
 }

   
 public static String list2json(List<?> list) {
     StringBuilder json = new StringBuilder();
     json.append(“[");
     if (list != null && list.size() > 0) {
       for (Object obj : list) {
         json.append(object2json(obj));
         json.append(",");
       }
       json.setCharAt(json.length() - 1, ']‘);
     } else {
       json.append(“]”);
     }
     return json.toString();
 }

   
 public static String array2json(Object[] array) {
     StringBuilder json = new StringBuilder();
     json.append(“[");
     if (array != null && array.length > 0) {
       for (Object obj : array) {
         json.append(object2json(obj));
         json.append(",");
       }
       json.setCharAt(json.length() - 1, ']‘);
     } else {
       json.append(“]”);
     }
     return json.toString();
 }

   
 public static String map2json(Map<?, ?> map) {
     StringBuilder json = new StringBuilder();
     json.append(“{“);
     if (map != null && map.size() > 0) {
       for (Object key : map.keySet()) {
         json.append(object2json(key));
         json.append(“:”);
         json.append(object2json(map.get(key)));
         json.append(“,”);
       }
       json.setCharAt(json.length() – 1, ‘}’);
     } else {
       json.append(“}”);
     }
     return json.toString();
 }

   
 public static String set2json(Set<?> set) {
     StringBuilder json = new StringBuilder();
     json.append(“[");
     if (set != null && set.size() > 0) {
       for (Object obj : set) {
         json.append(object2json(obj));
         json.append(",");
       }
       json.setCharAt(json.length() - 1, ']‘);
     } else {
       json.append(“]”);
     }
     return json.toString();
 }

   
 public static String string2json(String s) {
     if (s == null)
       return “”;
     StringBuilder sb = new StringBuilder();
     for (int i = 0; i < s.length(); i++) {
       char ch = s.charAt(i);
       switch (ch) {
       case ‘”‘:
         sb.append(“\\\“”);
         break;
       case ‘\\’:
         sb.append(“\\\\“);
         break;
       case ‘\b’:
         sb.append(“\\b“);
         break;
       case ‘\f’:
         sb.append(“\\f“);
         break;
       case ‘\n’:
         sb.append(“\\n“);
         break;
       case ‘\r’:
         sb.append(“\\r“);
         break;
       case ‘\t’:
         sb.append(“\\t“);
         break;
       case ‘/’:
         sb.append(“\\/“);
         break;
       default:
         if (ch >= ‘\u0000′ && ch <= ‘\u001F’) {
           String ss = Integer.toHexString(ch);
           sb.append(“\\u“);
           for (int k = 0; k < 4 – ss.length(); k++) {
             sb.append(‘0′);
           }
           sb.append(ss.toUpperCase());
         } else {
           sb.append(ch);
         }
       }
     }
     return sb.toString();
 }

 这个是封装好的json工具类,可以直接放到程序里面使用,需要转成什么数据都可以了。

分类: java日记 标签:

原创 json数据格式

2010年6月25日 懒猫 没有评论

     json是一种简单的数据格式,比XML更轻巧。现在用数据进行交换都是通过JSON的格式继续传递数据。他是以键值对的形式存储数据。

    var json = {
  totalProperty : 2,
  root : [{
     "empName" : "aaa",
     "empNo" : "1111",
     "empPost" : "销售部",
     "empProvince" : "陜西"
    }, {
     "empName" : "小白",
     "empNo" : "2222",
     "empPost" : "技术部",
     "empProvince" : "山西"
    }]
 }

    这是json的格式,totalProperty 表示这个里面总共存有几条记录,root 表示具体的数据,一个“{ }” 表格一个对象,外面的中括号就表示一个数组。这里就表示存有2条记录。

    json数据格式 可以与 list 集合,JavaBean对象,数组,map 之间进行转换,转换方式也有很多种、。可以到网上找一下JsonUtil 这个公共类之间拿来用。JSON自己也提供了json.js,从http://www.json.org/json.js 下载,将其引用就可以简单的使用了。例如:JSONArray.fromObject(object)  将json转成对象。object.toJSONString()转换成JSON数据。 可以使用eval来转换JSON字符到Object

  • function myEval() {   
  •     var str = ’{ ”name”: ”Violet”, ”occupation”: ”character” }’;   
  •     var obj = eval(‘(‘ + str + ’)');   
  •     alert(obj.toJSONString());   
  • }
  •     在页面发送请求与服务器交换 发送数据与读取数据,只要将数据保存成json格式,读取的时候 用JsonReader读取,他会自动去解析加载数据。很是方便。使用json需要导入几个json的jar包。。

        json-lib-2.2.1-jdk15.jar,ognl-2.6.11.jar,commons-beanutils.jar;commons-httpclient.jar;
    commons-lang.jar;
    ezmorph.jar;不少人使用时会提示net.sf.ezmorph.xxx找不到,就是缺这个:
    morph-1.0.1.jar

    原创 MyEclipse7.5 安装 SVN插件

    2010年6月24日 懒猫 没有评论

        MyEclipse7.5 安装SVN插件 在线安装法。。。

       在工具栏中 选择 help –> softwave updates –> add/remove softwave — add –>add site.
       在name 里面写上 SVN, 在URL 写上 http://subclipse.tigris.org/update
       然后 OK ,在选择 SVN插件,到安装 一直next 完成。

       在菜单栏中选择Window→Open Perspective→Other打开Myeclipse试图列表。这个时候Myeclipse的视图列表中,就出现了“SVN Repository Exploring”一项。
       打开“SVN Repository Exploring”视图。在左边空白区域,单击右键→New→Repository Location。
       在Url一栏中输入 — 本地SVN地址(http://IP/svn/projectName), 点击Finish按钮。
    输入用户名和密码,点击OK即可看到SVN下的目录结构了。

    原创 NetBeans 6.9正式版发布(附下载地址)

    2010年6月24日 懒猫 没有评论

        NetBeans的发展很快,前段时间才有说netBeans6.8发布,还新增了很多功能,添加了嵌入式浏览器支持和JavaEE6 支持 ,此外还有 ruby maven, C++ 等增强特性。
       现在NetBeans6.9又是跨了很大一步。。现在6.9还内置shell,(本地、远程)。

        之前一直都只是用NetBeans做桌面应用程序开发,现在是看到用NetBeans开发,哪种都很炫了。。

    PS:下载地址:

    http://developer.51cto.com/art/201006/206073.htm

    分类: java日记 标签:

    转载 Exjts 已改名为 sencha

    2010年6月23日 懒猫 没有评论

          今天在javaeye上,看到一篇文章说EXTJS已经改名为sencha,连域名也更改 了。。
    extjs

         June 14, 2010

         Hello,

         As a valued member of the our community, we wanted you to be the first to know that exciting things are happening at Ext JS. Today, we’re combining forces with the jQTouch and Raphaël projects and changing our name to Sencha. Our new website is www.sencha.com . For more details about the name change, please see my blog post at sencha.com/blog .

         jQTouch and Raphaël are the leading open source projects in their areas, and we’re incredibly excited to have their creators, David Kaneda and Dmitry Baranovskiy, joining the team. We believe these collaborations will lead to some spectacular new things in the weeks and months ahead.

         We’re choosing Sencha as our name because it evokes next-generation software development and it’s easy to remember, spell and pronounce. Sencha — the name of a popular Japanese green tea — is in the tradition of Java. It feels memorable to us. We hope you like it too.

         The roadmaps for Ext JS, Ext GWT, Designer, Direct etc. don’t change, and we’re excited about the new things coming in Ext JS 4.0 and the rest of the product line.

         Most existing customers will not have to take any new steps, your service contracts and licenses will carry on unchanged. In the unlikely event that you do need to do anything, you will receive an email from us separately.

         Please feel free to email me with any questions, comments or concerns you might have about this event.

    Warm regards,

    Abe Elias
    Founder & CEO
    abe

    原创 Ext 比较两个日期 startDateField增加约束条件 设置开始日期

    2010年6月23日 懒猫 没有评论

    // 日期比较,结束日期必须在开始日期之后
    Ext.apply(Ext.form.VTypes, {
    daterange : function(val, field) {
    var date = field.parseDate(val);

    if (!date) {
    return false;
    }
    if (field.startDateField
    && (!this.dateRangeMax || (date.getTime() != this.dateRangeMax.getTime()))) {
    var start = Ext.getCmp(field.startDateField);
    start.setMaxValue(date);
    start.validate();
    this.dateRangeMax = date;
    } else if (field.endDateField&& (!this.dateRangeMin || (date.getTime() != this.dateRangeMin.getTime()))) {
    var end = Ext.getCmp(field.endDateField);
    end.setMinValue(date);
    end.validate();
    this.dateRangeMin = date;
    }

    return true;
    }
    });

    ——————form表单的两个日期控件——

    {
    columnWidth : .2,
    layout : “form”,
    items : [{
    xtype : "datefield",
    fieldLabel : "合同开始日期",
    width : 100,
    name : 'contractStartdt',
    id : 'contractStartdt',
    vtype : 'daterange',
    endDateField : 'contractEnddt',
    id : "contractStartdt",
    name : "contractStartdt"
    }]
    },

    {
    columnWidth : .2,
    layout : “form”,
    items : [{
    xtype : "datefield",
    fieldLabel : "合同结束日期",
    width : 100,
    name : 'contractEnddt',
    id : 'contractEnddt',
    vtype : 'daterange',
    startDateField : 'contractStartdt',
    id : "contractEnddt",
    name : "contractEnddt"
    }]
    }

    分类: java日记 标签:

    原创 Ext.gridPanel tbar添加多行工具栏

    2010年6月23日 懒猫 没有评论

    Ext.onReady(function() {

    //初始化数据
    var proData = {
    records : [{
    proName : "cocobra 居家内衣系列"
    }, {
    proName : "cocobra 休闲内衣系列"
    }]
    }

    var proCreate = new Ext.data.Record.create([{
    name : "proName",
    mapping : "proName",
    type : "string"
    }]);

    var fields = [{
    name : 'proName',
    mapping : 'proName'
    }];

    var proStore = new Ext.data.JsonStore({
    fields : fields,
    data : proData,
    root : ‘records’
    });

    var rowNum = new Ext.grid.RowNumberer(); //添加行号
    var projectColumn = new Ext.grid.ColumnModel([rowNum, {
    header : "项目名称",
    width : 160,
    dataIndex : "proName",
    id : "proName",
    sortable : true //设置排序
    }]);

    //第二個工具欄
    var tbar2 = new Ext.Toolbar({
    renderTo : Ext.grid.GridPanel.tbar,// 其中grid是上边创建的grid容器
    items : [{
    text : '添加',
    iconCls:'addBtn'
    }, {
    xtype : "tbseparator"
    }, {
    text : "删除",
    iconCls : "deleteBtn" //图片样式, 需要自己寫css樣式,引入手寫的css,如果用自带会因为浏览器不兼容而不显示图片
    }, {
    xtype : "tbseparator"
    }, {
    text : "删除全部",
    iconCls:'deleteBtn'
    }, {
    xtype : "tbseparator"
    }, {
    text : '保存',
    iconCls:'saveBtn'
    }]

    });

    //第三个工具栏

    var tbar3 = new Ext.Toolbar({
        renderTo: Ext.grid.GridPanel.tbar,
        items:[new Ext.form.TextField({
         fieldLabel:"测试"
        // width:100
         //height:30
        })]
       })

    var projectGrid = new Ext.grid.GridPanel({
    renderTo : “hello”,
    title : “项目管理”,
    widht : 180,
    height : 200,
    cm : projectColumn,
    store : proStore,
    autoScroll : true, // 内容溢出时产生滚动条
    tbar : [new Ext.form.ComboBox({
    store : ["喜羊羊与灰太狼", "cocobra"], //給ComboBox添加數據
    emptyText : ‘请选择供应商’,
    id : “provider”,
    name : “provider”,
    editable : false //是否允許輸入

    })],
    listeners : { //將第二個和第三个bar渲染到tbar裏面,自動加載進去
    ‘render’ : function() {
    tbar2.render(this.tbar);

    tbar3.render(this.tbar);

    }
    }
    });
    });

    —-css样式,给工具栏上面的按钮 添加图片,自定义样式,
    .deleteBtn {
    background-image: url(../images/default/dd/drop-no.gif) !important;
    margin-right:5px;
    background-repeat: no-repeat;
    }

    .addBtn {
    background-image: url(../images/default/dd/drop-add.gif) !important;
    margin-right:5px;
    background-repeat: no-repeat;
    }

    .saveBtn {
    background-image: url(../images/default/dd/drop-yes.gif) !important;
    margin-right:5px;
    background-repeat: no-repeat;
    }

    html 页面

    //在panel里面添加多行工具栏跟gridPanel不一样,直接添加就可以。
    分类: java日记 标签:

    原创 JFileChooser 打开(*.word,*.txt,*.pdf)文件

    2010年4月24日 懒猫 没有评论

         windows系统提供了一个叫Rundll32.exe的文件,顾名思义,它的作用是执行DLL文件中的内部函数,这样在进程当中,只会有rundll32.exe,而不会有DLL后门的进程,这样,就实现了进程上的隐藏。rundll32.exe的具体使用方法如下:
        Rundll32.exe DLLname,Functionname [Arguments] DLLname为需要执行的DLL文件名;Functionname为前边需要执行的DLL文件的具体引出函数;[Arguments]为引出函数的具体参数。
        结合url.dll和rundll32.exe,我们就可以通过在命令行中启动相应程序打开相应文档: 假设我有一个pdf文档,存放在c:\test.pdf 。打开命令行, 运行如下 命令:rundll32 url.dll FileProtocolHandler

        下面是通过JFileChoose对话框,选中一个文件之后,打开所选的文件,像直接双击打开文件一样的,打开选中的文件

    Java代码
    JFileChooser chooseFile = new JFileChooser();
    FileFilter filter = new FileFilter() {

    //要过滤的文件
    public boolean accept(File f) {
    //显示的文件类型
    if (f.isDirectory()) {
    return true;
    }
    //显示满足条件的文件
    return f.getName().endsWith(“.txt”) || f.getName().endsWith(“.java”);
    }

    /**
    * 这就是显示在打开框中
    */
    public String getDescription() {

    return “*.txt,*.java”;
    }
    };

    FileFilter filter1 = new FileFilter() {

    public boolean accept(File f) {
    if (f.isFile()) {
    return true;
    }
    //显示满足条件的文件
    return f.getName().endsWith(“.xls”);
    }

    /**
    * 这就是显示在打开框中
    */ public String getDescription() {
    return “*.xls”;
    }
    };

    chooseFile.addChoosableFileFilter(filter);
    chooseFile.addChoosableFileFilter(filter1);
    int open = chooseFile.showOpenDialog(this);
    if (open == JFileChooser.APPROVE_OPTION) {
    File f = chooseFile.getSelectedFile();
    Runtime runtime = Runtime.getRuntime();
    try{
    System.out.println(f.getAbsolutePath());
    //打开文件
    runtime.exec(“rundll32 url.dll FileProtocolHandler “+f.getAbsolutePath());
    }catch(Exception ex){
    ex.printStackTrace();
    }

    }

    原创 Swing渲染基本原理

    2010年4月24日 懒猫 没有评论

        利用Swing渲染,Swing应用程序绘制了在显示器上出现的用户界面。主要包括在事件、绘制 、渲染、双缓冲、线程。
        事件:Swing接收和处理事件的方式是理解线程如何在Swing内部交互及理解应用程序如何与Swing和AWT事件交互的关键。在Java中,事件可以来自本地系统,如一个可见的窗体或键盘输入。也可也是Java本身,如应用程序产生的请求。所有的时间都是放在一个事件队列中的,Java.awt.EventQueue负责取出事件并来派发事件,它的机制是一个单独的线程管理,叫做事件派发线程。
        绘制:Swing中的绘制是应用程序用来更新显示的过程,它也是由事件队列所受的影响来影响Swin组件的paint()和paintComponent()来绘制。是通过Swing或AWT库自身发起一个绘制请求,或应用程序代码发起这样子的一个请求。在这样子的情况下发起的请求,应用程序代码知道,基于一些内部状态的改变,显示也应该改变。
        组件中发起绘制方法的主要分为两类:异步请求和同步请求。

        异步绘制请求的工作原理 告诉Swing需要更新内容,让Swing处理了编排这些请求的细节,并适当的组合这些请求。所有的异步请求都是repaint()得变体,它也可以分为两类:整个组件的更新和指定区域的更新。

        repaint()的底层告诉Swing必须更新整个组件区域。如果这个组件是一个容器,后续的paint()方法的调用还会导致每个子组件更新自身。重绘请求可以说是合并,例如,请求一个重绘,而在对垒中已经有一个还没有运行过的重绘请求,那么第二个请求将被忽略,因为已经由最早的那个请求执行了。
        第二个方法和repaint()一样,只是重新绘制一个组件的部分区域
        一个简单的repaint()等同于repait(0,0,getWedth(),getHeight()).

        同步绘制请求:在处理同步绘制时必须小心处理,它必须在事件派发线程中进行,并且代码必须在正确的线程中以便正确的时间发生,如果不是正确的线程,结果也会不对。
        它也有两个方法几个方法,
        JComponet.paintImmediately(int x, int y,int w, int h) 和 JComponent.parintImmediately(Rectangle r)
    这两个方法是相同的,都是指定需要更新的区域。要强制一个组件内容同步绘画,paintImmediately()是唯一需要的方法。用它来告诉组件指定区域更新,内部是调用适当的paint();有几个缺点是不止必须在派发事件线程中,还得立刻执行paint(),所以意味着它是没有合并绘画请求的。
        还有一个是夜是Compont.paint(Graphics),正常发展情况下是不会调用的paint()的。但是在特定的情况下会调用,例如当要把一个组件渲染到一个图像,而不是它在Swing窗口中通常的位置。