和風細雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

          #

          用匿名類實現Comparator實現鏈表排序的例子

          package com.sitinspring;

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


          /**
           * 用匿名類實現排序的例子
           * 
          @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));
              
              
          // 創建一個比較器匿名類
              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);
              }

                
            }

          }

          posted @ 2008-02-22 10:26 和風細雨 閱讀(1578) | 評論 (0)編輯 收藏

          Java泛型類示例

               摘要: 泛型類示例一: package com.sitinpsring; import java.util.ArrayList; import java.util.List; /** *//**  * 泛型類示例一,成員變量為鏈表,T可以指代任意類類型.  * @author sitinsprin...  閱讀全文

          posted @ 2008-02-22 10:26 和風細雨 閱讀(1841) | 評論 (1)編輯 收藏

          java.math.BigDecimal使用示例

          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("負值="+op1.negate());

          System.out.println("指定精度的商="+op1.divide(op2,15, BigDecimal.ROUND_UP));
          輸出:

          和=6.14159
          差=0.14159
          積=9.8695877281
          商=1.04720
          負值=-3.14159
          指定精度的商=1.047196666666667

          posted @ 2008-02-22 10:07 和風細雨 閱讀(1086) | 評論 (1)編輯 收藏

          使用java.text.SimpleDateFormat類進行文本日期和Date日期的轉換

          Date類內部既不存儲年月日也不存儲時分秒,而是存儲一個從1970年1月1日0點0分0秒開始的毫秒數,而真正有用的年月日時分秒毫秒都是從這個毫秒數轉化而來,這是它不容易被使用的地方,尤其是顯示和存儲的場合。但Date類的優勢在于方便計算和比較。
          另一點,日常生活中我們習慣用年月日時分秒這樣的文本日期來表示時間,它方便顯示和存儲,也容易理解,但不容易計算和比較。
          綜上所述,我們在程序中進行日期時間處理時經常需要在在文本日期和Date類之間進行轉換,為此我們需要借助java.text.SimpleDateFormat類來進行處理,下文列舉了它的幾個常用示例。

          1.將Date轉化為常見的日期時間字符串
          這里我們需要用到java.text.SimpleDateFormat類的format方法,其中可以指定年月日時分秒的模式字符串格式。
          Date date = new Date();
          Format formatter = new SimpleDateFormat("yyyy年MM月dd日HH時mm分ss秒");
          System.out.println("轉化的時間等于="+formatter.format(date));
          其中
          yyyy表示四位數的年份
          MM表示兩位數的月份
          dd表示兩位數的日期
          HH表示兩位數的小時
          mm表示兩位數的分鐘
          ss表示兩位數的秒鐘

          2.將文本日期轉化為Date以方便比較
          文本日期的優勢在于便于記憶,容易處理,但缺點是不方便比較,這時我們需要借助SimpleDateFormat的parse方法得到Date對象再進行比較,實例如下:
          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比較能得出正確結果
          if(date2.compareTo(date1)>0){
                System.out.println(strDate2+">"+strDate1);
          }

          // 字符串比較得不出正確結果
          if(strDate2.compareTo(strDate1)>0){
                System.out.println(strDate2+">"+strDate1);
          }


          3.將文本日期轉化為Date以方便計算
          文本日期的另一個大問題是不方便計算,比如計算2008年1月9日的100天后是那一天就不容易,此時我們還是需要把文本日期轉化為Date進行計算,再把結果轉化為文本日期:
          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));

          posted @ 2008-02-22 10:07 和風細雨 閱讀(155) | 評論 (0)編輯 收藏

          表格渲染器示例



          實現類:
          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); 

                         
          // 進行渲染
                         if (hasFocus) 
                             
          // 如果獲得焦點則設置背景色為紅色
                             cell.setBackground(Color.red); 
                             
          //cell.setForeground(Color.black); 
                         }
           else 
                             
          if ((row % 2== 0
                                 
          // 偶數行設置為白色
                                 cell.setBackground(Color.white); 
                             }
           else 
                                 
          // 奇數行設置為藍色
                                 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); 
                         
                         
          // 先把所有單元格設置為白色
                         cell.setBackground(Color.white); 
                         
                         
          // 進行渲染
                         if (table.getColumnName(column).equals("年齡") ) // 如果列名等于“年齡”
                             
          // 取得單元格的文字
                             String strValue=(String)value;
                             
                             
          if(Pattern.matches("\\d+", strValue)){
                                 
          if(Integer.parseInt(strValue)>37){
                                     
          // 如果是數字且值大于37,將單元格背景設置為紅色
                                     cell.setBackground(Color.red); 
                                 }
                                 
                             }

                         }
           
                         
                         
          return cell; 
                 }
           
          }
           

          posted @ 2008-02-22 10:06 和風細雨 閱讀(409) | 評論 (0)編輯 收藏

          Java中參數傳遞是傳值還是傳址?

          什么是值傳遞?什么是引用傳遞?

          值傳遞是將要傳遞的值作為一副本傳遞.如
               int i=4;
               int j=i;
               這里相當于把14復制了一個副本給j,結果是i=4,j=4

          引用傳遞,傳遞的是引用對象的內存地址
               int *p,*p1;
               int j=5; *p=j; //這里是把j在內存當中的地址賦給了指針p
               p1=p;  //這里是把指針p中保存的地址(就是j的地址)賦給了指針p1
               j=4; //這里改變j的值 輸出結果是 j=4 , *p=4 , *p1=4 //因為p和p1指向的都是j 所以他們的值隨j值改變
          (以上說明和代碼來自http://zhidao.baidu.com/question/31191252.html)


          Java中函數參數的傳遞是值傳遞還是引用傳遞?

          Java中參數傳遞時傳遞到函數中的參數都是原變量的一份拷貝,對于非類類型如int,float等,這份拷貝自然和原變量脫離了關系,這不難理解;
          而對于類的實例而言,這份拷貝恰巧是實例引用的拷貝,它(參數)指向的實例地址和原實例引用指向的實例地址都是一樣的,因此對參數的修改有時也會影響到實例本身,故此造成了Java傳遞類實例是傳遞的引用即地址的假象,如下面例子中的changeMemberField函數,但是我們把參數指向的地址改到別的實例上時,如changeMember函數,我們會發現參數和原實例引用再也不會發生關系了,這里證明Java中參數傳遞是完完全全是傳值而不是傳址。

          例子代碼:

          代碼:
          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

          解釋
          第一個輸出10是因為int是基本類型,傳遞的參數是intValue的拷貝,對拷貝的修改對原值intValue沒有影響.
          第一個輸出10和上面是一個道理.
          第三個輸出1234.由于String是類類型, str是stringValue的地址拷貝,參數str指向的地址和stringValue的一致,但在函數changeString 中,由于String的特殊性, str=“5555”和str=new String(“5555”)是等價的, str指向了新的”5555”所在的地址,此句后str就與原來的stringValue徹底脫離了聯系.
          第四個輸出Member?name=Douglas?age=45的道理和上面相同.
          第五個輸出Member?name=Andy?age=20是因為changeMemberField函數中修改了參數member 的值,也就是修改member指向實例的值,而這個實例正是member指向的值,因此member就變成了name=Andy 且age=20.

          結論

          Java中參數傳遞的都是值,對應基本類型,傳遞的是原值的拷貝;對于類類型,傳遞的是引用即地址的拷貝.
          對于函數對參數的改變是否會影響原值的問題:值類型自然不會影響到原值.而對于類類型要看改變的是參數的地址還是值,如果是前者,參數和原引用指向了不同的地址,它們自然脫離了關系;如果是后者,修改的實例就是原引用指向的實例,這當然對原值進行了修改.

          代碼下載
          http://www.aygfsteel.com/Files/sitinspring/PassValueOrReference20080116142420.rar

          posted @ 2008-02-22 09:19 和風細雨 閱讀(5031) | 評論 (6)編輯 收藏

          反射Reflection綜述

          反射Reflection是Java被視為動態語言的一個關鍵性質.這個機制允許程序在運行時通過Reflection APIs得到任何一個已知名稱的類的相關信息,包括其構造方法,父類,實現的接口,成員變量(field)和成員方法(method)的相關信息,并可在運行時改變成員變量的值或調用其方法.反射的高度靈活的特性使得它成為Java語言中最具魔力和活力的部分,它是許多流行框架的實現基礎,如Struts,Spring和Hibernate,本篇將列舉一些反射常見的API:

          實現反射機制的類
          在JDK中,主要由以下類來實現Java反射機制,這些類都位于java.lang.reflect包中:
          Class類:代表一個類。
          Field 類:代表類的成員變量(成員變量也稱為類的屬性)。
          Method類:代表類的方法。
          Constructor 類:代表類的構造方法。
          Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法。

          反射的源頭:Class類
          Java類繼承體系的是一個單根體系,所有類的都起源于Object類,其內聲明了數個應該在所有Java class中被改寫的methods:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一個Class object。當一個class被加載,或當加載器(class loader)的defineClass()被JVM調用,JVM 便自動產生一個Class object。
          由于在java.lang.Object 類中定義了getClass()方法,因此對于任意一個Java對象,都可以通過此方法獲得對象的類型。
          Class類對象代表了Java應用程序中的各種類和接口.這些類不是程序代碼生成的,而是在Java虛擬機(JVM)裝入各種類時生成的.

          Static class forName(String className)
          這個方法返回以className為名字的Class對象。
          Object newInstance()
          創建該Class對象代表的類的一個實例,類似調用一個無參數的構造函數。這個方法要求類必須具有一個無參構造函數,如果沒有時調用此方法程序會拋出一個java.lang.InstantiationException異常,這也是許多框架要求類具有一個無參構造函數的根本原因
          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對象代表的類的父類。如果該Class是Object,接口,基本數據類型或void,則返回nulll,如果這個類對象是數組,則返回Object類的類對象
          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對象實現的接口。
          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)

          返回構造函數,如果有parameterTypes,返回參數類型為parameterTypes的構造函數,Declared是指類中聲明的所有構造函數,如果沒有Declared,則只返回共有構造函數。
          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.classint.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參數,返回名字是name的成員變量,Declared指聲明中所有的成員變量,如果沒有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參數,返回名字是name,且有parameterTypes參數列表的方法、Declared指聲明中所有的方法(包括public,private,protected),如果沒有Declared,則只返回公有方法。

          Method類有一個重要方法
          Object invoke(Object obj,Object[] arg),
          通過它可以進行類方法調用,在后面的例子中會見到。
          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);
              }
            }
          }

          調用類的方法
          Method類有一個重要方法
          Object invoke(Object obj,Object[] arg),
          Object代表返回值,obj是類實例, arg是參數數組。

          這個方法能調用實例的一個方法。如右:
          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();
              }
            }
          }

          通過Field對對象進行設值取值請見:http://www.aygfsteel.com/sitinspring/archive/2008/01/03/172455.html

          通過Method對對象進行設值取值請見:
          http://www.aygfsteel.com/sitinspring/archive/2008/01/05/172970.html

          posted @ 2008-02-22 09:19 和風細雨 閱讀(215) | 評論 (0)編輯 收藏

          Tomcat6中JDBC數據源(Oracle)的配置

               摘要: 費了一番周折,把Tomcat6中JDBC數據源配置好了,這里把過程寫一下。感覺是某些網上的東西不可全信,還是官方文檔管用。 步驟一:將Oracle的數據庫驅動包classes12.jar拷貝到$CATALINA_HOME/lib下,我的Tomcat6庫位置是C:\Tomcat6\lib,就拷貝到這里。 步驟二:改寫server.xml。 server.xml在$CATALINA_...  閱讀全文

          posted @ 2008-02-22 09:14 和風細雨 閱讀(3537) | 評論 (0)編輯 收藏

          擴展DefaultTreeCellRenderer創建自己的樹節點渲染器示例。

          通常來說,使用下面的方法確實能改變樹節點的圖標,但靈活性不高。
          // 設定葉節點圖標
          Icon leafIcon = new ImageIcon(TreeViewPanel.class
                  .getResource(
          "/leaf.gif"));
          // 設定關閉狀態節點圖標
          Icon closedIcon = new ImageIcon(TreeViewPanel.class
                  .getResource(
          "/close.gif"));
          // 設定打開狀態節點圖標
          Icon openIcon = new ImageIcon(TreeViewPanel.class
                  .getResource(
          "/open.gif"));

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

          // 設定葉節點圖標
          renderer.setLeafIcon(leafIcon);

          // 設定關閉狀態節點圖標
          renderer.setClosedIcon(closedIcon);

          // 設定打開狀態節點圖標
          renderer.setOpenIcon(openIcon);

          但這樣靈活性不高,如我想每層的圖標都不一樣就不能使用這種方法了,我想要的效果如下:


          這時我們只有擴展DefaultTreeCellRenderer創建自己的樹節點渲染器,我創建的渲染器代碼如下:
          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;

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

          public class TreeNodeRenderer extends DefaultTreeCellRenderer{
              
          private static final long serialVersionUID = 8532405600839140757L;
              
              
          // 數據庫圖標,頂層節點用
              private static final Icon databaseIcon = new ImageIcon(TreeNodeRenderer.class
                      .getResource(
          "/database.gif"));
              
              
          // 表圖標,第三層節點用
              private static final Icon tableIcon = new ImageIcon(TreeNodeRenderer.class
                      .getResource(
          "/leaf.gif"));
              
              
          // 表空間關閉狀態圖標,關閉狀態的第二層節點用
              private static final Icon tableSpaceCloseIcon = new ImageIcon(TreeNodeRenderer.class
                      .getResource(
          "/close.gif"));
              
              
          // 表空間關閉狀態圖標,打開狀態的第二層節點用
              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);   
                  
          // 取得節點
                  DefaultMutableTreeNode node=(DefaultMutableTreeNode)value;
                  
                  
          // 取得路徑
                  TreeNode[] paths = node.getPath();
                  
                  
          // 按路徑層次賦予不同的圖標
                  if (paths.length == 3{            
                      setIcon(tableIcon);
                  }
          else if(paths.length == 2){
                      
          // 按展開情況再賦予不同的圖標
                      if(expanded){
                          setIcon(tableSpaceOpenIcon);
                      }

                      
          else{
                          setIcon(tableSpaceCloseIcon);
                      }

                  }

                  
          else if(paths.length == 1){
                      setIcon(databaseIcon);
                  }

                  
                  
          return this;        
              }

          }

          使用這個渲染器使用以下代碼就行了:
          tree.setCellRenderer(new TreeNodeRenderer());

          以上。

          posted @ 2008-02-22 09:12 和風細雨 閱讀(2843) | 評論 (0)編輯 收藏

          JDBC分頁示例(Oracle數據庫)

               摘要: 實例一: 效果圖: 頁面代碼: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><table>          ...  閱讀全文

          posted @ 2008-02-22 09:12 和風細雨 閱讀(465) | 評論 (0)編輯 收藏

          僅列出標題
          共10頁: First 上一頁 2 3 4 5 6 7 8 9 10 下一頁 
          主站蜘蛛池模板: 衢州市| 寿阳县| 商丘市| 西乡县| 龙胜| 行唐县| 化州市| 德令哈市| 邵东县| 崇信县| 阿拉善左旗| 凤庆县| 镇坪县| 商南县| 丹巴县| 织金县| 蕉岭县| 都昌县| 平度市| 栾川县| 邵东县| 满城县| 务川| 南川市| 民县| 黔南| 肥城市| 比如县| 阳山县| 成安县| 浪卡子县| 陕西省| 黔西| 定陶县| 柳江县| 横山县| 乌什县| 柯坪县| 阿尔山市| 洞头县| 永安市|