java闪屏怎么制作,Java Swing创建自定义闪屏:在闪屏下画进度条(一)

这篇博客介绍了如何使用JavaSwing创建自定义的闪屏,模拟NetBeans启动时的进度条效果。作者通过解析Swing程序启动时的SplashScreen机制,展示了如何获取闪屏对象并利用Graphics2D在闪屏上绘制文字和进度条。代码示例详细展示了从初始化到更新闪屏的整个过程,并提供了设置闪屏图片的方法。
摘要由CSDN通过智能技术生成

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对象,在闪屏上画出来各种各样的“东西”而不仅仅限于提示字符和模拟的进度条了。

看一下效果图

1331551593.jpg

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

好了,贴上代码吧:

/*

* 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://yshjava.iteye.com/blog/1326450

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值