默认
发表评论 5
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
Java滤镜妙用:一个图标实现JButton的3种状态下的效果
阅读(29266) | 评论(5 收藏 淘帖
本帖最后由 码神 于 2015-8-24 22:53 编辑

点评


通常情况下,要想实现JButton的正常状态(Normal)、鼠标移到其上(Rover)和鼠标按下(Pressed) 3种状态时,需要对应3个状态下的不同效果图标,为美工切图和程序员换图带来不便。

其实利用Java的图片滤镜效果,即可实现1个图标自动生成3态下的对应效果图标,而且简单易用,老少皆宜,实乃居家旅行必备。

有图有真相


正常状态时的图标效果:
Java滤镜妙用:一个图标实现JButton的3种状态下的效果_屏幕快照 2015-08-24 22.08.30.png

Rover时的图标效果:
Java滤镜妙用:一个图标实现JButton的3种状态下的效果_QQ20150824-1.png

鼠标按下时的图标效果:
Java滤镜妙用:一个图标实现JButton的3种状态下的效果_QQ20150824-2.png

代码实现


JButton的设置代码:
ImageIcon i = 你的获取图标代码;
// 正常状态的图标设置
functionIconBtn.setIcon(i);
// rover时图片颜色变成红色
functionIconBtn.setRolloverIcon(SwingUtils.filterWithRescaleOp(i, 2f, 1f, 1f, 1f));
// press时图片颜色变成淡红色
functionIconBtn.setPressedIcon(SwingUtils.filterWithRescaleOp(i, 2f, 1f, 1f, 0.3f));

SwingUtils.filterWithRescaleOp(..)代码:
        /**
         * 使用RescaleOp对图片进行滤镜处理.
         * 
         * @param iconBottom 原图
         * @param redFilter 红色通道滤镜值,1.0f表示保持不变
         * @param greenFilter 绿色通道滤镜值,1.0f表示保持不变
         * @param blueFilter 蓝色通道滤镜值,1.0f表示保持不变
         * @param alphaFilter alpha通道滤镜值,1.0f表示保持不变
         * @return 处理后的图片新对象
         */
        public static ImageIcon filterWithRescaleOp(ImageIcon iconBottom
                        , float redFilter, float greenFilter, float blueFilter, float alphaFilter)
        {
                try
                {
                        int w = iconBottom.getIconWidth(), h = iconBottom.getIconHeight();

                        // 原图
                        BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
                        Graphics2D gg = (Graphics2D)bi.getGraphics();
                        gg.drawImage(iconBottom.getImage(), 0, 0,w, h,null);

                        // 设置滤镜效果
                        float[] scales = { redFilter, greenFilter, blueFilter,alphaFilter };
                        float[] offsets = new float[4];
                        RescaleOp rop = new RescaleOp(scales, offsets, null);

                        // 执行
                        rop.filter(bi, bi);
                        return new ImageIcon(bi);
                }
                catch (Exception e)
                {
                        e.printStackTrace();
                        return new ImageIcon();
                }
        }
API在线查看:http://cngeeker.com/extend/docs/api/javase-8u51/java/awt/image/RescaleOp.html

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:Java Swing经典神书:Swing Hacks电子书下载(含源码)下一篇:JAVA Swing 自定义进度条样式(简单实现)
推荐方案
评论 5
这是以前工程里的实现,没想到你对这还挺得意的。
引用:JackJiang 发表于 2015-8-28 17:32
这是以前工程里的实现,没想到你对这还挺得意的。

敬礼!
签名: 家里电脑坏了,还让不让人好好撸了。
省掉2张图片还不错
正想实现这效果
学习下,好东西!!!
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部