#
package com.sitinspring;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;



/** *//**
* 用匿名類實(shí)現(xiàn)排序的例子
* @author sitinspring(junglesong@gmail.com)
*
* @date 2007-12-7
*/

public class Main
{

public static void main(String[] args)
{
// 新建鏈表并加入元素
List<Member> members=new ArrayList<Member>();
members.add(new Member("Andy",20));
members.add(new Member("Dell",23));
members.add(new Member("Felex",24));
members.add(new Member("Bill",21));
members.add(new Member("Cindy",22));
// 創(chuàng)建一個(gè)比較器匿名類

Comparator comparator=new Comparator()
{

public int compare(Object op1,Object op2)
{
Member memberOp1=(Member)op1;
Member memberOp2=(Member)op2;
// 按姓名排序
return memberOp1.getName().compareTo(memberOp2.getName());
}
};
// 排序
Collections.sort(members,comparator);
// 輸出排序后的鏈表

for(Member member:members)
{
System.out.println(member);
}
}
}
摘要: 泛型類示例一:
package com.sitinpsring;
import java.util.ArrayList;
import java.util.List;
/** *//**
* 泛型類示例一,成員變量為鏈表,T可以指代任意類類型.
* @author sitinsprin...
閱讀全文
BigDecimal op1=new BigDecimal("3.14159");
BigDecimal op2=new BigDecimal("3");
System.out.println("和="+op1.add(op2));
System.out.println("差="+op1.subtract(op2));
System.out.println("積="+op1.multiply(op1));
System.out.println("商="+op1.divide(op2, BigDecimal.ROUND_UP));
System.out.println("負(fù)值="+op1.negate());
System.out.println("指定精度的商="+op1.divide(op2,15, BigDecimal.ROUND_UP));
輸出:
和=6.14159
差=0.14159
積=9.8695877281
商=1.04720
負(fù)值=-3.14159
指定精度的商=1.047196666666667
Date類內(nèi)部既不存儲(chǔ)年月日也不存儲(chǔ)時(shí)分秒,而是存儲(chǔ)一個(gè)從1970年1月1日0點(diǎn)0分0秒開始的毫秒數(shù),而真正有用的年月日時(shí)分秒毫秒都是從這個(gè)毫秒數(shù)轉(zhuǎn)化而來(lái),這是它不容易被使用的地方,尤其是顯示和存儲(chǔ)的場(chǎng)合。但Date類的優(yōu)勢(shì)在于方便計(jì)算和比較。
另一點(diǎn),日常生活中我們習(xí)慣用年月日時(shí)分秒這樣的文本日期來(lái)表示時(shí)間,它方便顯示和存儲(chǔ),也容易理解,但不容易計(jì)算和比較。
綜上所述,我們?cè)诔绦蛑羞M(jìn)行日期時(shí)間處理時(shí)經(jīng)常需要在在文本日期和Date類之間進(jìn)行轉(zhuǎn)換,為此我們需要借助java.text.SimpleDateFormat類來(lái)進(jìn)行處理,下文列舉了它的幾個(gè)常用示例。
1.將Date轉(zhuǎn)化為常見(jiàn)的日期時(shí)間字符串
這里我們需要用到j(luò)ava.text.SimpleDateFormat類的format方法,其中可以指定年月日時(shí)分秒的模式字符串格式。
Date date = new Date();
Format formatter = new SimpleDateFormat("yyyy年MM月dd日HH時(shí)mm分ss秒");
System.out.println("轉(zhuǎn)化的時(shí)間等于="+formatter.format(date));
其中
yyyy表示四位數(shù)的年份
MM表示兩位數(shù)的月份
dd表示兩位數(shù)的日期
HH表示兩位數(shù)的小時(shí)
mm表示兩位數(shù)的分鐘
ss表示兩位數(shù)的秒鐘
2.將文本日期轉(zhuǎn)化為Date以方便比較
文本日期的優(yōu)勢(shì)在于便于記憶,容易處理,但缺點(diǎn)是不方便比較,這時(shí)我們需要借助SimpleDateFormat的parse方法得到Date對(duì)象再進(jìn)行比較,實(shí)例如下:
String strDate1="2004年8月9日";
String strDate2="2004年10月5日";
SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy年MM月dd日");
java.util.Date date1 = myFormatter.parse(strDate1);
java.util.Date date2 = myFormatter.parse(strDate2);
// Date比較能得出正確結(jié)果
if(date2.compareTo(date1)>0){
System.out.println(strDate2+">"+strDate1);
}
// 字符串比較得不出正確結(jié)果
if(strDate2.compareTo(strDate1)>0){
System.out.println(strDate2+">"+strDate1);
}
3.將文本日期轉(zhuǎn)化為Date以方便計(jì)算
文本日期的另一個(gè)大問(wèn)題是不方便計(jì)算,比如計(jì)算2008年1月9日的100天后是那一天就不容易,此時(shí)我們還是需要把文本日期轉(zhuǎn)化為Date進(jìn)行計(jì)算,再把結(jié)果轉(zhuǎn)化為文本日期:
SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy年MM月dd日");
java.util.Date date = myFormatter.parse("2008年1月9日");
date.setDate(date.getDate()+100);
Format formatter = new SimpleDateFormat("yyyy年MM月dd日");
// 得到2008年04月18日
System.out.println("100天后為"+formatter.format(date));
實(shí)現(xiàn)類:
package com.sitinspring.view.panel;

import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


/** *//**
* 間隔色表格渲染類
* @author: sitinspring(junglesong@gmail.com)
* @date: 2008-1-10
*/

public class ColorTableCellRenderer extends DefaultTableCellRenderer
{
private static final long serialVersionUID = -3378036327580475639L;

public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,

int column)
{
// 得到渲染的單元格
Component cell =
super.getTableCellRendererComponent(
table,
value,
isSelected,
hasFocus,
row,
column);

// 進(jìn)行渲染

if (hasFocus)
{
// 如果獲得焦點(diǎn)則設(shè)置背景色為紅色
cell.setBackground(Color.red);
//cell.setForeground(Color.black);

} else
{

if ((row % 2) == 0)
{
// 偶數(shù)行設(shè)置為白色
cell.setBackground(Color.white);

} else
{
// 奇數(shù)行設(shè)置為藍(lán)色
cell.setBackground(Color.cyan);
}
}
return cell;
}
}

package com.sitinspring.view.panel;

import java.awt.Color;
import java.awt.Component;
import java.util.regex.Pattern;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


/** *//**
* 大於37顯示紅色的表單元格
* @author: sitinspring(junglesong@gmail.com)
* @date: 2008-1-10
*/

public class AgeTableCellRenderer extends DefaultTableCellRenderer
{
private static final long serialVersionUID = -334535475639L;

public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,

int column)
{
// 得到單元格
Component cell =
super.getTableCellRendererComponent(
table,
value,
isSelected,
hasFocus,
row,
column);
// 先把所有單元格設(shè)置為白色
cell.setBackground(Color.white);
// 進(jìn)行渲染

if (table.getColumnName(column).equals("年齡") )
{ // 如果列名等于“年齡”
// 取得單元格的文字
String strValue=(String)value;

if(Pattern.matches("\\d+", strValue))
{

if(Integer.parseInt(strValue)>37)
{
// 如果是數(shù)字且值大于37,將單元格背景設(shè)置為紅色
cell.setBackground(Color.red);
}
}
}
return cell;
}
}
什么是值傳遞?什么是引用傳遞?
值傳遞是將要傳遞的值作為一副本傳遞.如
int i=4;
int j=i;
這里相當(dāng)于把14復(fù)制了一個(gè)副本給j,結(jié)果是i=4,j=4
引用傳遞,傳遞的是引用對(duì)象的內(nèi)存地址
int *p,*p1;
int j=5; *p=j; //這里是把j在內(nèi)存當(dāng)中的地址賦給了指針p
p1=p; //這里是把指針p中保存的地址(就是j的地址)賦給了指針p1
j=4; //這里改變j的值 輸出結(jié)果是 j=4 , *p=4 , *p1=4 //因?yàn)閜和p1指向的都是j 所以他們的值隨j值改變
(以上說(shuō)明和代碼來(lái)自http://zhidao.baidu.com/question/31191252.html)
Java中函數(shù)參數(shù)的傳遞是值傳遞還是引用傳遞?
Java中參數(shù)傳遞時(shí)傳遞到函數(shù)中的參數(shù)都是原變量的一份拷貝,對(duì)于非類類型如int,float等,這份拷貝自然和原變量脫離了關(guān)系,這不難理解;
而對(duì)于類的實(shí)例而言,這份拷貝恰巧是實(shí)例引用的拷貝,它(參數(shù))指向的實(shí)例地址和原實(shí)例引用指向的實(shí)例地址都是一樣的,因此對(duì)參數(shù)的修改有時(shí)也會(huì)影響到實(shí)例本身,故此造成了Java傳遞類實(shí)例是傳遞的引用即地址的假象,如下面例子中的changeMemberField函數(shù),但是我們把參數(shù)指向的地址改到別的實(shí)例上時(shí),如changeMember函數(shù),我們會(huì)發(fā)現(xiàn)參數(shù)和原實(shí)例引用再也不會(huì)發(fā)生關(guān)系了,這里證明Java中參數(shù)傳遞是完完全全是傳值而不是傳址。
例子代碼:
代碼:
package com.sitinspring;
public class ChangeClass{
public void changeInt(int i){
i=5;
}
public void changeLong(long i){
i=555;
}
public void changeString(String str){
str="5555";
}
public void changeMember(Member member){
member=new Member("Cindy",35);
}
public void changeMemberField(Member member){
member.setAge(20);
member.setName("Andy");
}
public static void main(String[] args){
ChangeClass changeClass=new ChangeClass();
int intValue=10;
changeClass.changeInt(intValue);
System.out.println(intValue);
long longValue=10;
changeClass.changeLong(longValue);
System.out.println(longValue);
String stringValue="1234";
changeClass.changeString(stringValue);
System.out.println(stringValue);
Member member2=new Member("Douglas",45);
changeClass.changeMember(member2);
System.out.println(member2);
Member member=new Member("Bill",25);
changeClass.changeMemberField(member);
System.out.println(member);
}
}
package com.sitinspring;
public class Member{
private String name;
private int age;
public Member(String name,int age){
this.age=age;
this.name=name;
}
public String toString(){
return "Member name="+name+" age="+age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
輸出:
10
10
1234
Member name=Douglas age=45
Member name=Andy age=20
解釋:
第一個(gè)輸出10是因?yàn)閕nt是基本類型,傳遞的參數(shù)是intValue的拷貝,對(duì)拷貝的修改對(duì)原值intValue沒(méi)有影響.
第一個(gè)輸出10和上面是一個(gè)道理.
第三個(gè)輸出1234.由于String是類類型, str是stringValue的地址拷貝,參數(shù)str指向的地址和stringValue的一致,但在函數(shù)changeString 中,由于String的特殊性, str=“5555”和str=new String(“5555”)是等價(jià)的, str指向了新的”5555”所在的地址,此句后str就與原來(lái)的stringValue徹底脫離了聯(lián)系.
第四個(gè)輸出Member?name=Douglas?age=45的道理和上面相同.
第五個(gè)輸出Member?name=Andy?age=20是因?yàn)閏hangeMemberField函數(shù)中修改了參數(shù)member 的值,也就是修改member指向?qū)嵗闹?而這個(gè)實(shí)例正是member指向的值,因此member就變成了name=Andy 且age=20.
結(jié)論
Java中參數(shù)傳遞的都是值,對(duì)應(yīng)基本類型,傳遞的是原值的拷貝;對(duì)于類類型,傳遞的是引用即地址的拷貝.
對(duì)于函數(shù)對(duì)參數(shù)的改變是否會(huì)影響原值的問(wèn)題:值類型自然不會(huì)影響到原值.而對(duì)于類類型要看改變的是參數(shù)的地址還是值,如果是前者,參數(shù)和原引用指向了不同的地址,它們自然脫離了關(guān)系;如果是后者,修改的實(shí)例就是原引用指向的實(shí)例,這當(dāng)然對(duì)原值進(jìn)行了修改.
代碼下載:
http://www.aygfsteel.com/Files/sitinspring/PassValueOrReference20080116142420.rar
反射Reflection是Java被視為動(dòng)態(tài)語(yǔ)言的一個(gè)關(guān)鍵性質(zhì).這個(gè)機(jī)制允許程序在運(yùn)行時(shí)通過(guò)Reflection APIs得到任何一個(gè)已知名稱的類的相關(guān)信息,包括其構(gòu)造方法,父類,實(shí)現(xiàn)的接口,成員變量(field)和成員方法(method)的相關(guān)信息,并可在運(yùn)行時(shí)改變成員變量的值或調(diào)用其方法.反射的高度靈活的特性使得它成為Java語(yǔ)言中最具魔力和活力的部分,它是許多流行框架的實(shí)現(xiàn)基礎(chǔ),如Struts,Spring和Hibernate,本篇將列舉一些反射常見(jiàn)的API:
實(shí)現(xiàn)反射機(jī)制的類
在JDK中,主要由以下類來(lái)實(shí)現(xiàn)Java反射機(jī)制,這些類都位于java.lang.reflect包中:
Class類:代表一個(gè)類。
Field 類:代表類的成員變量(成員變量也稱為類的屬性)。
Method類:代表類的方法。
Constructor 類:代表類的構(gòu)造方法。
Array類:提供了動(dòng)態(tài)創(chuàng)建數(shù)組,以及訪問(wèn)數(shù)組的元素的靜態(tài)方法。
反射的源頭:Class類
Java類繼承體系的是一個(gè)單根體系,所有類的都起源于Object類,其內(nèi)聲明了數(shù)個(gè)應(yīng)該在所有Java class中被改寫的methods:hashCode()、equals()、clone()、toString()、getClass()等。其中g(shù)etClass()返回一個(gè)Class object。當(dāng)一個(gè)class被加載,或當(dāng)加載器(class loader)的defineClass()被JVM調(diào)用,JVM 便自動(dòng)產(chǎn)生一個(gè)Class object。
由于在java.lang.Object 類中定義了getClass()方法,因此對(duì)于任意一個(gè)Java對(duì)象,都可以通過(guò)此方法獲得對(duì)象的類型。
Class類對(duì)象代表了Java應(yīng)用程序中的各種類和接口.這些類不是程序代碼生成的,而是在Java虛擬機(jī)(JVM)裝入各種類時(shí)生成的.
Static class forName(String className)
這個(gè)方法返回以className為名字的Class對(duì)象。
Object newInstance()
創(chuàng)建該Class對(duì)象代表的類的一個(gè)實(shí)例,類似調(diào)用一個(gè)無(wú)參數(shù)的構(gòu)造函數(shù)。這個(gè)方法要求類必須具有一個(gè)無(wú)參構(gòu)造函數(shù),如果沒(méi)有時(shí)調(diào)用此方法程序會(huì)拋出一個(gè)java.lang.InstantiationException異常,這也是許多框架要求類具有一個(gè)無(wú)參構(gòu)造函數(shù)的根本原因
package com.sitinspring;
public class Member{
private String name;
private int age;
private float salary;
public Member(){
name="Unknown";
age=20;
salary=1.00f;
}
public String toString(){
return "名稱="+name+" 年齡="+age+" 薪水="+salary;
}
public static void main(String[] args){
try{
Class cls=Class.forName("com.sitinspring.Member");
Member member=(Member)cls.newInstance();
System.out.println(member);
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
Class getSuperclass()
返回該Class對(duì)象代表的類的父類。如果該Class是Object,接口,基本數(shù)據(jù)類型或void,則返回nulll,如果這個(gè)類對(duì)象是數(shù)組,則返回Object類的類對(duì)象
public class Member extends Thread implements Comparable{
private String name;
private int age;
private float salary;
public Member(){
name="Unknown";
age=20;
salary=1.00f;
}
public String toString(){
return "名稱="+name+" 年齡="+age+" 薪水="+salary;
}
public int compareTo(Object obj){
Member another=(Member)obj;
return this.age-another.age;
}
public static void main(String[] args){
System.out.println(Member.class.getSuperclass());
System.out.println(Object.class.getSuperclass());
System.out.println(Comparable.class.getSuperclass());
System.out.println(int.class.getSuperclass());
System.out.println(void.class.getSuperclass());
System.out.println(String[].class.getSuperclass());
}
}
Class[] getInterfaces()
返回該Class對(duì)象實(shí)現(xiàn)的接口。
public class Member implements Comparable,Runnable{
private String name;
private int age;
private float salary;
public Member(){
name="Unknown";
age=20;
salary=1.00f;
}
public String toString(){
return "名稱="+name+" 年齡="+age+" 薪水="+salary;
}
public int compareTo(Object obj){
Member another=(Member)obj;
return this.age-another.age;
}
public void run(){
}
public static void main(String[] args){
for(Class cls:Member.class.getInterfaces()){
System.out.println(cls.toString());
}
}
}
輸出:
interface java.lang.Comparable
interface java.lang.Runnable
Construtor[] getConstructors()
Construtor[] getDeclaredConstructors()
Construtor[] getConstructors(Class[] parameterTypes)
Construtor[] getDeclaredConstructors(Class[] parameterTypes)
返回構(gòu)造函數(shù),如果有parameterTypes,返回參數(shù)類型為parameterTypes的構(gòu)造函數(shù),Declared是指類中聲明的所有構(gòu)造函數(shù),如果沒(méi)有Declared,則只返回共有構(gòu)造函數(shù)。
public class Member {
private String name;
private int age;
private float salary;
public Member() {
name = "Unknown";
age = 20;
salary = 1.00f;
}
public Member(String name, int age, float salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public String toString() {
return "名稱=" + name + " 年齡=" + age + " 薪水=" + salary;
}
public static void main(String[] args) {
for (Constructor cls : Member.class.getConstructors()) {
System.out.println(cls.toString());
}
try {
Class cls = Class.forName("com.sitinspring.Member");
Constructor con =cls.getConstructor(new Class[]{String.class, int.class,float.class});
Member member = (Member) con.newInstance(new Object[] {
new String("Sitinspring"), new Integer(30),
new Float(20000) });
System.out.println(member);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Field[] getFields()
Field[] getDeclaredFields()
Field getField(String name)
Field[] getDeclaredFields(String name)
返回成員變量。如果有name參數(shù),返回名字是name的成員變量,Declared指聲明中所有的成員變量,如果沒(méi)有Declared,則只返回公有成員變量。
public class Member {
private String name;
private int age;
private float salary;
public String field1;
protected String field2;
public static void main(String[] args) {
for (Field field : Member.class.getFields()) {
System.out.println(field);
}
for (Field field : Member.class.getDeclaredFields()) {
System.out.println(field.getName());
}
}
}
輸出:
public java.lang.String com.sitinspring.Member.field1
name
age
salary
field1
field2
Method[] getMethods()
Method[] getDeclaredMethods()
Method getMethod(String name,Class[] parameterTypes)
Method[] getDeclaredMethods(String name ,Class[] parameterTypes)
返回類的方法,如果有name和parameterTypes參數(shù),返回名字是name,且有parameterTypes參數(shù)列表的方法、Declared指聲明中所有的方法(包括public,private,protected),如果沒(méi)有Declared,則只返回公有方法。
Method類有一個(gè)重要方法
Object invoke(Object obj,Object[] arg),
通過(guò)它可以進(jìn)行類方法調(diào)用,在后面的例子中會(huì)見(jiàn)到。
public class Member {
private String name;
private int age;
private float salary;
public Member() {
name = "Unknown";
age = 20;
salary = 1.00f;
}
public String toString() {
return "名稱=" + name + " 年齡=" + age + " 薪水=" + salary;
}
public int getAge() {
return age;
}
protected String getName() {
return name;
}
private float getSalary() {
return salary;
}
public static void main(String[] args) {
for (Method method : Member.class.getMethods()) {
System.out.println(method);
}
System.out.println("--------------");
for (Method method : Member.class.getDeclaredMethods()) {
System.out.println(method);
}
}
}
調(diào)用類的方法
Method類有一個(gè)重要方法
Object invoke(Object obj,Object[] arg),
Object代表返回值,obj是類實(shí)例, arg是參數(shù)數(shù)組。
這個(gè)方法能調(diào)用實(shí)例的一個(gè)方法。如右:
public class Caculator{
public int add(int op1,int op2){
return op1+op2;
}
public int substract(int op1,int op2){
return op1-op2;
}
public static void main(String[] args){
try{
Caculator caculator=new Caculator();
Method addMethod = caculator.getClass().getMethod(
"add",
new Class[] { int.class,int.class });
Object result1=addMethod.invoke(caculator, new Object[] { 1,2 });
System.out.println("和="+result1);
Method substractMethod = caculator.getClass().getMethod(
"substract",
new Class[] { int.class,int.class });
Object result2=substractMethod.invoke(caculator, new Object[] { 3,4 });
System.out.println("差="+result2);
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
通過(guò)Field對(duì)對(duì)象進(jìn)行設(shè)值取值請(qǐng)見(jiàn):
http://www.aygfsteel.com/sitinspring/archive/2008/01/03/172455.html
通過(guò)Method對(duì)對(duì)象進(jìn)行設(shè)值取值請(qǐng)見(jiàn):
http://www.aygfsteel.com/sitinspring/archive/2008/01/05/172970.html
摘要: 費(fèi)了一番周折,把Tomcat6中JDBC數(shù)據(jù)源配置好了,這里把過(guò)程寫一下。感覺(jué)是某些網(wǎng)上的東西不可全信,還是官方文檔管用。
步驟一:將Oracle的數(shù)據(jù)庫(kù)驅(qū)動(dòng)包c(diǎn)lasses12.jar拷貝到$CATALINA_HOME/lib下,我的Tomcat6庫(kù)位置是C:\Tomcat6\lib,就拷貝到這里。
步驟二:改寫server.xml。
server.xml在$CATALINA_...
閱讀全文
通常來(lái)說(shuō),使用下面的方法確實(shí)能改變樹節(jié)點(diǎn)的圖標(biāo),但靈活性不高。
// 設(shè)定葉節(jié)點(diǎn)圖標(biāo)
Icon leafIcon = new ImageIcon(TreeViewPanel.class
.getResource("/leaf.gif"));
// 設(shè)定關(guān)閉狀態(tài)節(jié)點(diǎn)圖標(biāo)
Icon closedIcon = new ImageIcon(TreeViewPanel.class
.getResource("/close.gif"));
// 設(shè)定打開狀態(tài)節(jié)點(diǎn)圖標(biāo)
Icon openIcon = new ImageIcon(TreeViewPanel.class
.getResource("/open.gif"));

// 取得樹的渲染器
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree
.getCellRenderer();

// 設(shè)定葉節(jié)點(diǎn)圖標(biāo)
renderer.setLeafIcon(leafIcon);

// 設(shè)定關(guān)閉狀態(tài)節(jié)點(diǎn)圖標(biāo)
renderer.setClosedIcon(closedIcon);

// 設(shè)定打開狀態(tài)節(jié)點(diǎn)圖標(biāo)
renderer.setOpenIcon(openIcon);
但這樣靈活性不高,如我想每層的圖標(biāo)都不一樣就不能使用這種方法了,我想要的效果如下:
這時(shí)我們只有擴(kuò)展DefaultTreeCellRenderer創(chuàng)建自己的樹節(jié)點(diǎn)渲染器,我創(chuàng)建的渲染器代碼如下:
package com.sitinspring.common.render;

import java.awt.Component;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeNode;


/** *//**
* 樹節(jié)點(diǎn)渲染器
* @author: sitinspring(junglesong@gmail.com)
* @date: 2008-2-12
*/

public class TreeNodeRenderer extends DefaultTreeCellRenderer
{
private static final long serialVersionUID = 8532405600839140757L;
// 數(shù)據(jù)庫(kù)圖標(biāo),頂層節(jié)點(diǎn)用
private static final Icon databaseIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/database.gif"));
// 表圖標(biāo),第三層節(jié)點(diǎn)用
private static final Icon tableIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/leaf.gif"));
// 表空間關(guān)閉狀態(tài)圖標(biāo),關(guān)閉狀態(tài)的第二層節(jié)點(diǎn)用
private static final Icon tableSpaceCloseIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/close.gif"));
// 表空間關(guān)閉狀態(tài)圖標(biāo),打開狀態(tài)的第二層節(jié)點(diǎn)用
private static final Icon tableSpaceOpenIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/open.gif"));
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,

boolean hasFocus)
{
super.getTreeCellRendererComponent(tree,
value,
sel,
expanded,
leaf,
row,
hasFocus);
// 取得節(jié)點(diǎn)
DefaultMutableTreeNode node=(DefaultMutableTreeNode)value;
// 取得路徑
TreeNode[] paths = node.getPath();
// 按路徑層次賦予不同的圖標(biāo)

if (paths.length == 3)
{
setIcon(tableIcon);

}else if(paths.length == 2)
{
// 按展開情況再賦予不同的圖標(biāo)

if(expanded)
{
setIcon(tableSpaceOpenIcon);
}

else
{
setIcon(tableSpaceCloseIcon);
}
}

else if(paths.length == 1)
{
setIcon(databaseIcon);
}
return this;
}
}
使用這個(gè)渲染器使用以下代碼就行了:
tree.setCellRenderer(new TreeNodeRenderer());
以上。
摘要: 實(shí)例一:
效果圖:
頁(yè)面代碼:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><table>
...
閱讀全文