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