java闪屏怎么制作,Java Swing创建自定义闪屏:在闪屏下画进度条(一)
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://yshjava.iteye.com/blog/1326450
總結
以上是生活随笔為你收集整理的java闪屏怎么制作,Java Swing创建自定义闪屏:在闪屏下画进度条(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝如何取消淘宝免密支付
- 下一篇: php 提取登录QQ,php QQ登录