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