Swing Component 的漸進色和圖片背景

JRE 中內置的 Swing 的Look and Feel 都比較板,難以適應現在用戶對界面的要求。本人也找過其他的Look and Feel,但是始終沒有很如意的。不是太大,就是效果不理想。最後只好自己動手,針對比較常用的兩種效果做了點工作: 漸進色背景,和圖片背景。


這裏簡單介紹一點原理,代碼附後。

 

  • 漸進色的實現

利用java.awt.GradientPaint, 或者 java.awt.LinearGradientPaint。前者稍微簡單些,讀者可以自行查閱JavaDoc,後者使用舉例:

 

公用方法:

static public void paintGradientBackground(Graphics g, JComponent c,float[] fractions, Color[] colors)
    {
        if (c==null || fractions==null || colors==null || g==null ){
            System.err.println("有參數爲空,無法繪製!");
            return;
        }

        Graphics2D g2d = (Graphics2D)g;
        Dimension d = c.getSize();

        //
使用GradientPaint 的情況
        //GradientPaint paint = new GradientPaint(0,0,Color.WHITE,0,d.height/4,Color.green,true);

        //線性漸進色
        //默認漸進方式:從左上至右下
        Point2D start = new Point2D.Float(0, 0);
        Point2D end = new Point2D.Float(d.width, d.height);
       
        LinearGradientPaint lpaint = new LinearGradientPaint(start, end, fractions, colors);

        g2d.setPaint(lpaint);
        g2d.fillRect(0, 0, d.width, d.height);
       
    }

調用示例:

 

float fractions[] = new float[]{0.3f,0.7f};

Color colors[] = new Color[]{Color.WHITE, new Color(200,200,255)};

...

paintGradientBackground(g,c,fractions,colors);

 

  • component 的 UI

Swing 中部件的UI特性 都是可插入的(pluggable) ,以JPanel 爲例,我們可以自己寫一個PanelUI,來控制JPanel的繪製過程。

 

public class GradientPanelUI extends BasicPanelUI {
    
    public static ComponentUI createUI(JComponent c) {
        AppContext appContext = AppContext.getAppContext();
        GradientPanelUI compUI =
                (GradientPanelUI) appContext.get(GradientPanelUI.class.getSimpleName());
        if (compUI == null) {
            compUI = new GradientPanelUI();
            appContext.put(GradientPanelUI.class.getSimpleName(), compUI);
        }
        return compUI;
     }

   
    @Override
    public void update(Graphics g, JComponent c) {
       

        float fractions[] = new float[]{0.3f,0.7f};

        Color colors[] = new Color[]{Color.WHITE, new Color(200,200,255)};


        paintGradientBackground(g,c,fractions,colors);


        c.setOpaque(false);
        super.paint(g, c);
       
    }


}   

 

這個類的使用方法:

JPanel panel = new JPanel();

PanelUI pui = new GradientPanelU();

pane.setUI(pui);

 

  • 背景圖片的實現

在PaneUI中,update方法的參數Graphics g有繪製圖像的功能,把update方法改爲如下,即可以實現JPanel的圖片背景:

 

    @Override
    public void update(Graphics g, JComponent c) {
       

 

Dimension d = jc.getSize();

g.drawImage(wallpaperImage, 0, 0,d.width,d.height, c); //wallpaperImage是java.awt.Image類型的圖像數據。

c.setOpaque(false);
super.paint(g, c);

}

 

 

從一個圖像文件得到Image數據的方法:

Image img = Toolkit.getDefaultToolkit().createImage("D://Work//!Resource//紋理//ball.png");

 

綜合以上內容,就可以寫出 JPanel的漸進色背景 UI,以及圖片背景UI。

 

漸進色 和圖片背景(疊加)效果

同樣道理,其他控件(Component)的UI也都可以寫出來了。

 

以上介紹的方法只是設置單個Component的方法,如果要設置應用中默認的JPanel(或者其他的控件),只需在界面初始化之前加入:

 

UIManager.put("PanelUI", "yang.stoney.lnf.ui.GradientPanelUI");//PanleUI的完整類名

 

在複雜一點,可以自己寫一個 LookAndFeel類,來統一管理這些UI。本文不再討論。

 

 

完整代碼請看我的資源:http://download.csdn.net/source/2448067


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章