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


 

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