第一章JComponent——hack1~12

1、有动态效果的图像按钮

     核心代码就是设置按钮在按下、滑过等动作时的图像。

 

        button.setPressedIcon(new ImageIcon("images/button-down.png"));
        button.setRolloverIcon(new ImageIcon("images/button-over.png"));
        button.setSelectedIcon(new ImageIcon("images/button-sel.png"));
        button.setRolloverSelectedIcon(new ImageIcon("images/button-sel-over.png"));
        button.setDisabledIcon(new ImageIcon("images/button-disabled.png"));
        button.setDisabledSelectedIcon(new ImageIcon("images/button-disabled-selected.png"));

 

2、有下拉阴影、轮廓线和3D文本修饰的JLabel

     重写paintComponent方法,把一个个的字重新进行绘制。

   

      public void paintComponent(Graphics g) {
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
            RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
       
        char[] chars = getText().toCharArray();

        FontMetrics fm = this.getFontMetrics(getFont());
        int h = fm.getAscent();
        LineMetrics lm = fm.getLineMetrics(getText(),g);
        g.setFont(getFont());
       
        int x = 0;
       
        for(int i=0; i<chars.length; i++) {
            char ch = chars[i];
            int w = fm.charWidth(ch) + tracking;

            g.setColor(left_color);   //左边阴影效果的颜色
            g.drawString(""+chars[i],x-left_x,h-left_y);
           
            g.setColor(right_color);//右边阴影效果的颜色
            g.drawString(""+chars[i],x+right_x,h+right_y);

            g.setColor(getForeground()); //主体颜色
            g.drawString(""+chars[i],x,h);

            x+=w;
        }
       
    }

 

    如果要绘制出3D的效果,那么诀窍在设置两个阴影字体的绘制位置上。

        label.setLeftShadow(5,5,Color.white);//left_x,left_y,left_color
        label.setRightShadow(-3,-3, new Color(0xccccff)); //right_x,right_y,right_color
        label.setForeground(new Color(0x8888ff));
        label.setFont(label.getFont().deriveFont(140f));

  

3、图片填充边框

    JPanel.setBorder(Border border);

    Border是一个接口,自己实现paintBorder等方法。

 

4、定制日历组件

     重写JPanle.paintComponent方法,先把年月等信息绘制出来。

     然后 一个一个单元格(日期)的绘制日期信息,如果是当前日期,则用高亮显示的背景图案。

 

     for(int week = 0; week < 6; week++) {
            for(int d = 0; d < 7; d++) {
                Image img = day_img;
                Color col = Color.black;
                // only draw if it's actually in this month
                if(cal.get(Calendar.MONTH) == today.get(Calendar.MONTH)) {
                    if(cal.equals(today)) { img = highlight; col = Color.white; }
                    g.drawImage(img,d*30+46,week*29+81,null);
                    g.drawString(day.format(cal.getTime()),d*30+46+4,week*29+81+20);
                }
                cal.add(Calendar.DATE,+1);
            }
        }

 

        我打算修改这个日历组件,使它可以选择日期,就像C#日历控件一样。

 

5、为JTextField增加背景图像

     为 JTextFiled子类准备TexturePaint实例,重写paintComponent方法。

 

    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setPaint(texture); //texture是一个TexturePaint实例
        g.fillRect(0,0,getWidth(),getHeight());
        super.paintComponent(g);
    }

 

6、在滚动窗格中引入水印

     方法和5类似

 

7、向文本域背景添加NASA照片

     启动一个进程去网站上抓取图片,这个进程每2个小时启动一次,其他时间休眠。因为网站的图片链接url可能发生变化,所以需要不断进行更新。抓取网页的html代码,利用正则表达式匹配,得到img标签的值。增加背景图案的方法类似6,只是传入的不再是图片的物理路径地址,而是一个url地址。

 

8、动态切换分页

    这是今天看到最为震撼的效果,swing居然有这样的功能。

   

9、对失效组件添加模糊效果

    public void paintComponent(Graphics g) {
        if(isEnabled()) { //没有失效时,不用做任何特殊处理
            super.paintComponent(g);
            return;
        }
       
        float[] my_kernel = {
            0.10f, 0.10f, 0.10f,
            0.10f, 0.20f, 0.10f,
            0.10f, 0.10f, 0.10f };
        ConvolveOp op = new ConvolveOp(new Kernel(3,3, my_kernel)); //此类实现从源到目标的卷积,这种运算使得直接邻域可 按核数学指定的方式影响输出像素。                                                                
        BufferedImage buf = new BufferedImage(getWidth(),getHeight(),
            BufferedImage.TYPE_INT_RGB);
        super.paintComponent(buf.getGraphics());
        Image img = op.filter(buf,null);
        g.drawImage(img,0,0,null);
       
    }

 

10、构建下拉菜单按钮

11、创建带下拉阴影的菜单

12、为菜单添加透明效果

        这三个特性我都没什么兴趣,一扫而过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值