<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    和風細雨

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

    #

    用匿名類實現(xiàn)Comparator實現(xiàn)鏈表排序的例子

    package com.sitinspring;

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


    /**
     * 用匿名類實現(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)建一個比較器匿名類
        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 和風細雨 閱讀(1573) | 評論 (0)編輯 收藏

    Java泛型類示例

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

    posted @ 2008-02-22 10:26 和風細雨 閱讀(1835) | 評論 (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 和風細雨 閱讀(1082) | 評論 (1)編輯 收藏

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

    Date類內(nèi)部既不存儲年月日也不存儲時分秒,而是存儲一個從1970年1月1日0點0分0秒開始的毫秒數(shù),而真正有用的年月日時分秒毫秒都是從這個毫秒數(shù)轉化而來,這是它不容易被使用的地方,尤其是顯示和存儲的場合。但Date類的優(yōu)勢在于方便計算和比較。
    另一點,日常生活中我們習慣用年月日時分秒這樣的文本日期來表示時間,它方便顯示和存儲,也容易理解,但不容易計算和比較。
    綜上所述,我們在程序中進行日期時間處理時經(jīng)常需要在在文本日期和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表示四位數(shù)的年份
    MM表示兩位數(shù)的月份
    dd表示兩位數(shù)的日期
    HH表示兩位數(shù)的小時
    mm表示兩位數(shù)的分鐘
    ss表示兩位數(shù)的秒鐘

    2.將文本日期轉化為Date以方便比較
    文本日期的優(yōu)勢在于便于記憶,容易處理,但缺點是不方便比較,這時我們需要借助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 和風細雨 閱讀(152) | 評論 (0)編輯 收藏

    表格渲染器示例



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

                   
    // 進行渲染
                   if (hasFocus) 
                       
    // 如果獲得焦點則設置背景色為紅色
                       cell.setBackground(Color.red); 
                       
    //cell.setForeground(Color.black); 
                   }
     else 
                       
    if ((row % 2== 0
                           
    // 偶數(shù)行設置為白色
                           cell.setBackground(Color.white); 
                       }
     else 
                           
    // 奇數(shù)行設置為藍色
                           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){
                               
    // 如果是數(shù)字且值大于37,將單元格背景設置為紅色
                               cell.setBackground(Color.red); 
                           }
                           
                       }

                   }
     
                   
                   
    return cell; 
           }
     
    }
     

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

    Java中參數(shù)傳遞是傳值還是傳址?

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

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

    引用傳遞,傳遞的是引用對象的內(nèi)存地址
         int *p,*p1;
         int j=5; *p=j; //這里是把j在內(nèi)存當中的地址賦給了指針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中函數(shù)參數(shù)的傳遞是值傳遞還是引用傳遞?

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

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

    結論

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

    代碼下載
    http://m.tkk7.com/Files/sitinspring/PassValueOrReference20080116142420.rar

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

    反射Reflection綜述

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

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

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

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

    返回構造函數(shù),如果有parameterTypes,返回參數(shù)類型為parameterTypes的構造函數(shù),Declared是指類中聲明的所有構造函數(shù),如果沒有Declared,則只返回共有構造函數(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.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參數(shù),返回名字是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參數(shù),返回名字是name,且有parameterTypes參數(shù)列表的方法、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是參數(shù)數(shù)組。

    這個方法能調用實例的一個方法。如右:
    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://m.tkk7.com/sitinspring/archive/2008/01/03/172455.html

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

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

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

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

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

    擴展DefaultTreeCellRenderer創(chuàng)建自己的樹節(jié)點渲染器示例。

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

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

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

    // 設定關閉狀態(tài)節(jié)點圖標
    renderer.setClosedIcon(closedIcon);

    // 設定打開狀態(tài)節(jié)點圖標
    renderer.setOpenIcon(openIcon);

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


    這時我們只有擴展DefaultTreeCellRenderer創(chuàng)建自己的樹節(jié)點渲染器,我創(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é)點渲染器
     * 
    @author: sitinspring(junglesong@gmail.com)
     * @date: 2008-2-12
     
    */

    public class TreeNodeRenderer extends DefaultTreeCellRenderer{
        
    private static final long serialVersionUID = 8532405600839140757L;
        
        
    // 數(shù)據(jù)庫圖標,頂層節(jié)點用
        private static final Icon databaseIcon = new ImageIcon(TreeNodeRenderer.class
                .getResource(
    "/database.gif"));
        
        
    // 表圖標,第三層節(jié)點用
        private static final Icon tableIcon = new ImageIcon(TreeNodeRenderer.class
                .getResource(
    "/leaf.gif"));
        
        
    // 表空間關閉狀態(tài)圖標,關閉狀態(tài)的第二層節(jié)點用
        private static final Icon tableSpaceCloseIcon = new ImageIcon(TreeNodeRenderer.class
                .getResource(
    "/close.gif"));
        
        
    // 表空間關閉狀態(tài)圖標,打開狀態(tài)的第二層節(jié)點用
        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é)點
            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 和風細雨 閱讀(2828) | 評論 (0)編輯 收藏

    JDBC分頁示例(Oracle數(shù)據(jù)庫)

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

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

    僅列出標題
    共10頁: First 上一頁 2 3 4 5 6 7 8 9 10 下一頁 
    主站蜘蛛池模板: 亚洲精品国精品久久99热一| 青青草a免费线观a| jizz日本免费| 又硬又粗又长又爽免费看 | 亚洲精品乱码久久久久久| 亚洲片一区二区三区| 一本色道久久88亚洲综合 | 国产精品黄页在线播放免费| 青草草在线视频永久免费| 成年人免费观看视频网站| 影音先锋在线免费观看| 日本久久久免费高清| 四虎影视永久免费观看地址| avtt亚洲天堂| 国产偷国产偷亚洲清高动态图| 亚洲精品国产精品乱码视色| 午夜亚洲www湿好大| 亚洲熟妇无码爱v在线观看| 亚洲伊人久久大香线焦| 亚洲精品精华液一区二区| 国产精品亚洲精品日韩电影| 九九久久精品国产免费看小说| 中文字幕永久免费| 一区二区免费视频| 波多野结衣免费在线| 狼友av永久网站免费观看| 亚洲国产成人久久笫一页| 亚洲欧洲日产国码无码久久99| 1区1区3区4区产品亚洲| 亚洲狠狠成人综合网| 免费看一级高潮毛片| 久久免费观看国产精品88av| 日韩精品成人无码专区免费| 国产精品自在自线免费观看| 亚洲中文字幕无码中文字在线 | 免费乱码中文字幕网站| 亚洲伊人久久精品影院| 亚洲最新中文字幕| 免费可以看黄的视频s色| 午夜视频免费成人| 亚洲色欲久久久综合网东京热|