Swinghacks——滚动控件的背景

先看效果图片:


好吧,你没看懂就对了,我来解释一下

图中的效果是,拖动滚动条,背景的云图片 和 飞碟图片 位置都不变,文本内容跟着滚动条变化

可能你觉得这个没什么实际用处,不过飞碟图片换成某些logo或许好点,比如CCTV

来看实现原理

首先你要知道JScrollPane分9个区域(可以参考http://blog.csdn.net/mylxiaoyi/article/details/7487167),中间的viewport区域就是内容

一般我们是用JScrollPane的这个方法来添加控件到中间区域public void setViewportView(Component view)

但是需要画的背景就是中间区域的背景,所以要重写JViewport类,然后重载paintComponent和paintChildren,再把JViewport  set到JScrollPane

JViewport先调用paintComponent来画自己,然后调用paintChildren来画添加到JViewport的Component

这样思路就来了,先在paintComponent方法里画云图片背景,然后在paintChildren里调用super画子控件,再画飞碟图片

上代码:

import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.imageio.*;
import java.awt.image.*;
import javax.swing.table.*;

// put a texture in the background
// put a translucent image in the foreground

// put a yellow gradient inthe background
// put a translucent sun in the upper right

public class ScrollPaneWatermark extends JViewport {
    BufferedImage fgimage, bgimage;
    TexturePaint texture;
    
    public ScrollPaneWatermark(){
        super();
        //setOpaque(false);
    }
    
    public void setBackgroundTexture(URL url) throws IOException {
        bgimage = ImageIO.read(url);
        Rectangle rect = new Rectangle(0,0,
                bgimage.getWidth(null),bgimage.getHeight(null));
        texture = new TexturePaint(bgimage, rect);
    }
    
    public void setForegroundBadge(URL url) throws IOException {
        fgimage = ImageIO.read(url);
    }
    
    public void paintComponent(Graphics g) {
        // do the superclass behavior first
        super.paintComponent(g);
        System.out.println("p");
        //画云背景
        if(texture != null) {
            Graphics2D g2 = (Graphics2D)g;
            g2.setPaint(texture);
            g.fillRect(0,0,getWidth(),getHeight());
        }
    }
    
    public void paintChildren(Graphics g) {
        super.paintChildren(g);
        //画飞碟
        if(fgimage != null) {
        g.drawImage(fgimage, 
            getWidth()-fgimage.getWidth(null), 0,
            null);
        }
    }
    
    public void setView(JComponent view) {
        view.setOpaque(false);
        super.setView(view);
    }
    
    public static void main(String[] args) throws Exception {
        JFrame frame = new JFrame("Scroll Pane Watermark Hack");
        
        JTextArea ta = new JTextArea();
        ta.setText(fileToString(new File("alice.txt")));
        ta.setLineWrap(true);
        ta.setWrapStyleWord(true);
        //ta.setOpaque(false);
        
        ScrollPaneWatermark watermark = new ScrollPaneWatermark();
        watermark.setBackgroundTexture(new File("clouds.jpg").toURL());
        watermark.setForegroundBadge(new File("flyingsaucer.png").toURL());
        watermark.setView(ta);
        
        JScrollPane scroll = new JScrollPane();
        scroll.setViewport(watermark);
        frame.getContentPane().add(scroll);
        frame.pack();
        frame.setSize(600,600);
        frame.show();
    }
    
    public static String fileToString( File file )
        throws FileNotFoundException, IOException {
        FileReader reader = new FileReader( file );
        StringWriter writer = new StringWriter();
        char[] buf = new char[1000];
        while ( true ) {
            int n = reader.read( buf, 0, 1000 );
            if ( n == -1 ) {
                break;
            }
            writer.write( buf, 0, n );
        }
        return writer.toString();
    }
}


Java编程语言一般是和重要的企业级应用程序联系在一起的,运行它们的服务器可能主位于蒙大拿的某个冰冷的机房里。不过,是桌面应用催生了Java,未来也必将是桌面应让Java能更加光彩夺目。通过AWT和现在的Swing,Java为编写图形化用户界面提供了丰富的客户端API。不过想要让Java、AWT和Swing达到最佳性能并不容易(也不方便),特别是在模拟交互式Web站点或像Windows XP和Mac OS X这样的操作系统外观时更是如此。\r\n 本书能帮助JAVA开发人员跳过Swing的基础节直接让桌面应用程序贴近现实。如果读者是一个Java开人员,并想开发带有一流外观的企业级应用程序,那就应该掌握Swing。不过对Swing的hack并不仅仅局限于对它的正常使用,而是关于一些读者或许要经过多年才能领会到的技巧。它们是一些富有创造性的、原创的甚至是诡异的hack,能让读者发出由衷的惊叹:“我可没想过居然能用Swing干这个!”\r\n 在本书中,读者将学到:\r\n 过滤不用的列表控件,对用户的输入做出合适的反应;\r\n 为列表和组合框组件提供拖放功能;\r\n 在图形组件之间实现动态效果,并能创建动态列表式界面;\r\n 控制任何方面,从鼠标指针到光标,乃至闪动键盘灯;\r\n 在Swing中构建分层、覆盖组件并灵活使用透明窗格屏蔽Swing接口内部的复杂细节和伸缩性。 ================================== 对学习SWING很有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值