`
杨胜寒
  • 浏览: 286211 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java Swing创建自定义闪屏:在闪屏上画进度条(一)

阅读更多

由于本人十分热爱Java Swing,所以平时闲暇之余总是喜欢极尽所能去搜藏一些自认为比较“酷”的Swing代码来研究揣摩。昨天的两篇文章,介绍了Java Swing透明和不规则窗体的创建和原理,是一年半以前我还在学校的时候搞出来的。在学校的日子因为轻松、自由、专注,所以总是让人倍加怀念。这一怀念不打紧,让我翻出了以前写的N多“烂”代码,好在时至今日我还能勉强看懂,花了一个上午的时间整理了一下,现在跟大家分享一个分别模仿NetBeans和MyEclipse启动画面的Java Swing闪屏制作技巧。

 

用过NetBeans和MyEclipse的童鞋,对它们的启动画面(也叫闪屏,下文所述如不加以说明,都是指闪屏)肯定都非常熟悉了,它们在启动的时候,向启动画面输出当前初始化的进度信息:包括文字信息和进度条信息。当然他们也有细微的不同之处,仔细观察就能发现,NetBeans的进度条似乎太不“专业”,随便在闪屏上画个矩形,然后对部分区域以红色填充以代表进度;相反,MyEclipse则要好多了,“闪屏”上出现的是一个标准的进度条控件。二者优劣无法评断,也不是本文的主题所在,这里本人将以两篇文章的篇幅分别介绍如何实现NetBeans式的闪屏和MyEclipse式的闪屏。

本文将从原理到代码,详细介绍如何实现NetBeans的闪屏。

 

原理:Swing程序启动后,虚拟机会根据指定的图片生成一个SplashScreen,在Swing窗体显示之前出现在屏幕的中央,以告知用户,程序已经在很努力的加载了。在程序中,我们可以通过SplashScreen.getSplashScreen()得到这个闪屏对象,然后,通过该对象我们又可以得到闪屏的图形对象(Graphics2D对象)。得到这个对象以后,相信接下来不用多说,很多人都知道该如何借助这个Graphics2D对象,在闪屏上画出来各种各样的“东西”而不仅仅限于提示字符和模拟的进度条了。

 

看一下效果图

 

最上面的那一行字符串,是加载进度提示信息,最下面的红色区域是模拟出来的进度条。当然啦,他们的位置、形状、颜色都是可以定制的。

好了,贴上代码吧:

 

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cn.ysh.studio.gui.window;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.SplashScreen;
import javax.swing.UIManager;

/**
 *
 * @author 杨胜寒
 */
public class Splash {

    //在这儿你能获得通过-splash:设置给程序的splash screen的实例
    private final SplashScreen splash = SplashScreen.getSplashScreen();
    private Rectangle splashBounds;
    private Graphics2D splashGraphics;

    /**
     * 初始化splash
     */
    protected void initSplash() {
        if (splash != null) {
            //下面给splash screen画一个边框
            splashBounds = splash.getBounds();
            //在这儿初始化图形对象,该图形对象取自splash
            splashGraphics = (Graphics2D) splash.createGraphics();
            if (splashGraphics != null) {
                splashGraphics.setColor(Color.BLUE);
                splashGraphics.drawRect(0, 0, splashBounds.width - 1, splashBounds.height - 1);
            }
        }
    }

    /**
     * 更新splash,这个方法
     */
    protected void updateSplash(String status, int progress) {
        if (splash == null || splashGraphics == null) {
            return;
        }
        //重画splash上面的进度并通知splash更新界面
        drawSplash(splashGraphics, status, progress);
        splash.update();
    }

    /**
     * 这个方法画一个进度条,不再详述。
     */
    protected void drawSplash(Graphics2D splashGraphics, String status, int progress) {
        int barWidth = splashBounds.width;//进度条长度
        splashGraphics.setComposite(AlphaComposite.Clear);
        splashGraphics.fillRect(1, 10, splashBounds.width - 2, 20);//闪屏边框
        splashGraphics.setPaintMode();//模型
        splashGraphics.setColor(Color.ORANGE);//字符串颜色
        splashGraphics.drawString(status, 10, 20);//画字符串
        splashGraphics.setColor(Color.red);//进 度条填充颜色
        int width = progress * barWidth / 100;//进度条当前值
        splashGraphics.fillRect(0, splashBounds.height - 20, width, 6);
    }

    /**
     * 这儿是加载程序的过程
     */
    protected void loadApplication() {
        //初始化splash
        initSplash();
        //模拟的加载进度提示信息
        final String[] stages = {"正在启动", "正在读取数据", "正在加载相关文档", "启动完成"};
        int stage = 0;
        //在下面你初始化程序的过程中调用updateSplash来更新splash
        for (int i = 0; i <= 100; i += 1) {
            String status = stages[stage];
            if (splash != null) {
                //更新闪屏图像
                updateSplash(status, i);
            }
            if (i == 30) {
                stage = 1;
            } else if (i == 70) {
                stage = 2;
            } else if (i == 90) {
                stage = 3;
            }
            try {
                //故意等待
                Thread.sleep(20);
            } catch (Exception e) {
                //异常不做处理
            }
        }
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
        }
        MainWindow window = new MainWindow();
        //在这儿你可以主动关闭splash
        if (splash != null) {
            splash.close();
        }
        //真正开始的你的登录界面或者主窗口       
        window.setVisible(true);
    }

    public static void main(String args[]) {
        new Splash().loadApplication();
    }
}

 

顺便提一下,在Java Swing应用程序中指定闪屏很简单,只需在jar文件的META-INF文件夹下的MANIFEST.MF文件的
Main-Class: cn.ysh.studio.gui.window.Splash上面加这么一行SplashScreen-Image: META-INF/splash.jpg就可以了,系统启动时将以此图片生成闪屏。该图片必须位于jar包中,路径为包名+文件名。

 

 

 

原创文章,转载请注明出处: http://www.yshjava.cn/post/325.html

 

 

 

 

 

 

  • 大小: 47.6 KB
2
1
分享到:
评论

相关推荐

    Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(二)

    NULL 博文链接:https://yshjava.iteye.com/blog/1326539

    在Java程序前添加一个闪屏

    在Java程序中添加一个闪屏(Splash Screen)是提高用户体验的一种常见方法,它可以在应用程序启动时展示一个带有品牌标识或加载进度的短暂画面,让用户感知到程序正在准备运行。下面我们将详细探讨如何在Java程序中...

    韩顺平的《满汉楼》项目闪屏源码

    该源码是一个Java程序,用于实现一个简单的登录闪屏效果,类似于应用或游戏启动时的加载界面。这个闪屏界面包含了一些动态的文字滚动效果,以及背景图片。下面我们将详细解析代码中的关键知识点: 1. **Java Swing...

    韩顺平满汉楼餐饮系统部分功能实现

    在Java中,可以使用Java Swing或JavaFX库来创建。通常,闪屏会有一个进度条或者动画效果,以展示程序初始化的过程,给用户带来更好的使用体验。 2. **登录界面**: 登录界面是用户进入系统的入口,涉及用户验证和...

    JSplashScreen-开源

    JSplashScreen 是一个针对 Java 平台的开源库,它的主要功能是在应用程序启动时展示一个闪屏(Splash Screen)。闪屏通常用于提供品牌形象展示,或者显示应用程序加载过程,给予用户一个良好的启动体验。通过 ...

    Java核心技术II(第8版)

    第一章 流与文件 1.1 流 1.1.1 读入和写出字节 1.1.2 完整的流家族 1.1.3 组合流过滤器 1.2 文本输入与输出 1.2.1 如何写出文本输出 1.2.2 如何读入文本输入 1.2.3 以文本格式存储对象 1.2.4 字符集 1.3 读入和写出...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

Global site tag (gtag.js) - Google Analytics