键盘上的舞者

像写情书一样Coding...

用户操作
[即时聊天] [发私信] [加为好友]
陈维ID:chenweionline
67282次访问,排名1531好友11人,关注者0
专注 Java Desktop 技术,多年 Java GUI 开发经验。
chenweionline的文章
原创 55 篇
翻译 0 篇
转载 19 篇
评论 141 篇
键盘上的舞者的公告

专注 JAVA Desktop 技术

简单做到极致

最近评论
zhangping:你好,我想我大约是遇上了和你同样的问题。

我的问题是:

我这里有一些java源文件,其中有些注释是日文写的。
在日文操作系统中,运行没有问题,但是在中文操作系统中

用NetBeans6.1重新建立工程,进行Build的时候,会报错和警告:



* <p>&……
兴趣:THS,能否介绍一些资料。
兴趣:如果采用JAVA, 它这方面的功能足够了吗?
兴趣:如果采用JAVA, 它这方面的功能足够了吗?
SunShine:哇~~帅呆了
文章分类
收藏
    相册
    ChinaJoy 2008
    女魔头
    上海浦东软件园
    养在深闺人未识
    Favorite
    Apple-NaNa
    CnGadGet
    NOTCOT.ORG
    虚拟无忌
    技术
    Geertjan's Weblog
    java.net forums
    Let's Swing Java
    Mac Java Community
    NetBeans Rich Client Application (RCP)
    NetBeans星球
    open open
    朋友
    Christina
    企鹅博士
    地平线上
    阿憨月经
    非上上智
    资源
    balloontip
    bluemarine
    JAI
    JAI-ImageIO
    JMONKEYENGINE
    jna
    jrawio
    metadata extraction in java
    pdf-renderer
    QuickTime for Java
    swinglabs
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 为 Java 桌面应用程序添加 Splash 屏幕收藏

    新一篇: NetBeans 6.0 Release | 旧一篇: 为 JFileChooser 添加选择文件有效验证功能

    版权声明:转载时请务必保留以下作者信息和链接
    作者:陈维(chenweionline@hotmail.com)作者的网站:http://www.chenwei.mobi

    当应用程序启动初始,进行各种类库的初始化和装载,此时出现一个醒目的 Splash 屏幕提示着用户软件正在进行初始化工作,同时可以通过显示广告、法律许可和软件 logo 等等,给予软件用户更积极的反馈。

    熟悉 Java SE 6 的朋友应该知道 Java 6 允许一个应用程序在 JVM 启动前就可以显示一个 Splash 屏幕,而我今天要说的是针对无数使用旧版本 Java 的用户——如何在使用 Java 6 之前版本开发的软件中创建一个 Splash 屏幕。

    我们可以把 Splash 屏幕看作一个在程序主窗体显示前显示的画布组件,当程序初始化完毕,主窗体在屏幕上显示后Splash 屏幕自动关闭,完成它的使命。

    在了解了 Splash 屏幕的行为及作用后,我选择扩展 JDialog 来完成对它的实现。

    首先定制 JDialog 的外观使它符合 Splash 屏幕的外形。

    在构造函数通过设置设置属性 alwaysOnTop 使窗体变成顶层窗体永远出现在屏幕最上层;属性 undecorated 禁用 dialog 的装饰,这样可以去除窗体上的文本栏以及窗体最大 / 最小化 / 关闭按钮,使其完全作为一个画布存在;最后根据将在其上绘制图像的大小尺寸设置 size 属性并且将 locationRelativeTo 属性设置为 null,使其显示时出现在屏幕正中。

    setAlwaysOnTop(true);
    setUndecorated(
    true);
    setSize(
    new Dimension(image.getWidth(), image.getHeight()));
    setLocationRelativeTo(
    null);

    然后覆写 dialog 的 paint(Graphics g) 方法完成指定图像(广告、法律许可和 logo 等等)在画布上的绘制。

    public void paint(Graphics g) {
            
    if(image != null{
                g.drawImage(image, 
    00this);
            }

    }

    接下来我们需要编写控制 Splash 行为的代码。

    从用户体验上看,Splash 屏幕在程序主窗体打开前显示,在主窗体打开后关闭。那么它必定和主窗体的打开事件相关联,我们在 dialog 的构造函数里传入一个主窗体的引用,向其添加一个 ComponentListener, 当主窗体变为可见时销毁当前的 dialog 实例。

    frame.addComponentListener(new ComponentAdapter() {

                    @Override
                    
    public void componentShown(ComponentEvent e) {
                        JSplashScreen.
    this.dispose();
                    }

    }
    );

    到这里,一个 Splash 屏幕的主要代码就完成了。

    通过给它添加一个鼠标监听器用来监听鼠标按下事件,使其也可以作为 About 窗体使用。当鼠标在画布上点击,窗体自动销毁。同时,我们在这个组件里定义两个静态常量用来标识它是作为 Splash 还是 About 使用。 

    //public static final int SPLASH_MODE = 0;
    //public static final int ABOUT_MODE = 1;


            
    if (mode == SPLASH_MODE) {
                frame.addComponentListener(
    new ComponentAdapter() {

                    @Override
                    
    public void componentShown(ComponentEvent e) {
                        JSplashScreen.
    this.dispose();
                    }

                }
    );
            }
     else {
                addMouseListener(
    new MouseAdapter() {
                    
                    @Override
                    
    public void mouseClicked(java.awt.event.MouseEvent evt) {
                        dispose();
                    }

                }
    );
            }

     下面是 Splash 屏幕组件 JSplashScreen.java 的完整代码

    /*
     * JSplashScreen.java
     *
     * Created on 2007年11月20日, 下午1:42
     
    */

    package mobi.chenwei.wing.swing;

    import java.awt.Dimension;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import java.awt.event.MouseAdapter;

    /**
     * Splash Screen
     * 根据不同的 mode 属性设置,也可以作为 About 窗体使用。
     * 
     * 
    @author Chen Wei
     * @website www.chenwei.mobi
     * @email chenweionline@hotmail.com
     
    */

    public class JSplashScreen extends javax.swing.JDialog {

        
    public static final int SPLASH_MODE = 0;
        
    public static final int ABOUT_MODE = 1;
        
    private Frame frame = null;
        
    private int mode = SPLASH_MODE;
        
    private BufferedImage image = null;
        


        
    public JSplashScreen(Frame frame, int mode, BufferedImage image) {

            
    if (frame == null{
                
    throw new IllegalArgumentException("frame must be non null");
            }

            
    if (mode != SPLASH_MODE && mode != ABOUT_MODE) {
                
    throw new IllegalArgumentException("mode must be one of: SPLASH_MODE or ABOUT_MODE");
            }

            
    if (image == null{
                
    throw new IllegalArgumentException("image must be non null");
            }


            
    this.frame = frame;
            
    this.mode = mode;
            
    this.image = image;

            
    if (mode == SPLASH_MODE) {
                frame.addComponentListener(
    new ComponentAdapter() {

                    @Override
                    
    public void componentShown(ComponentEvent e) {
                        JSplashScreen.
    this.dispose();
                    }

                }
    );
            }
     else {
                addMouseListener(
    new MouseAdapter() {

                    @Override
                    
    public void mouseClicked(java.awt.event.MouseEvent evt) {
                       
    JSplashScreen.this.dispose();
                    }

                }
    );
            }


            initComponents();

            setSize(
    new Dimension(image.getWidth(), image.getHeight()));
            setLocationRelativeTo(
    null);
        }

        
        
    /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         
    */

        
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {

            setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
            setAlwaysOnTop(
    true);
            setUndecorated(
    true);
            getContentPane().setLayout(
    null);
        }
    // </editor-fold>

        @Override
        
    public void paint(Graphics g) {
            
    if (image != null{
                g.drawImage(image, 
    00this);
            }

        }

    }

    使用方法:

    package mobi.chenwei.wing.swing;

    import java.awt.image.BufferedImage;

    /**
     * Splash Screen 的测试类
     * 
     * 
    @author Chen Wei
     * @website www.chenwei.mobi
     * @email chenweionline@hotmail.com
     
    */

    public class TestSplash extends javax.swing.JFrame {

        
    public TestSplash () {

            
    // 给 Splash 屏幕添加一个背景图
            BufferedImage image = new BufferedImage(400300, BufferedImage.TYPE_INT_BGR);
            
    // 初始化 Splash 屏幕并显示
            JSplashScreen splash = new JSplashScreen(this, JSplashScreen.SPLASH_MODE, image);
            splash.setVisible(
    true);

            
    // 耗时的初始化方法
        initComponents();

        }


        
    private void initComponents() {

            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

            java.awt.Dimension screenSize 
    = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
            setBounds((screenSize.width 
    - 800/ 2, (screenSize.height - 600/ 2800600);

        }


        
    public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(
    new Runnable() {

                
    public void run() {
                    
    new TestSplash().setVisible(true);
                }

            }
    );
        }


    }

     JSplashSceen 组件应用在 Panowalker_1.0 上的屏幕截图

     

    发表于 @ 2007年12月03日 15:23:00|评论(loading...)|收藏

    新一篇: NetBeans 6.0 Release | 旧一篇: 为 JFileChooser 添加选择文件有效验证功能

    评论

    #BusAudio 发表于2007-12-11 21:31:22  IP: 59.173.110.*
    不错,用JFrame、Jwindow都可以实现一样的功能。
    不过对BufferedImage的用法不是很清楚,你给出的源码中用BufferedImage,请问它是怎样加载图片的?为什么你没有直接选择image类?谢谢!

    #chenweionline 发表于2007-12-12 00:01:34  IP: 61.173.63.*
    在 AWT 中,提供了一个 java.awt.Image 类。Image 代表一个图像对象被作为参数传递给其他用来显示和处理图像的其他 AWT 对象使用,它的加载和显示使用Producer / Consumer (push) model 。在Java 2D里采用Immediate mode model来处理图像,图像的对象实例就是BufferedImage,BufferedImage可以使用ImageIO通过加载源图像得到,具体可以检索一下API文档。
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 键盘上的舞者