您的位置:首页 > 编程语言 > Java开发

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

2015-08-16 21:21 267 查看
本文将讲解如何做一个类似MyEclipse启动画面的闪屏,为Java Swing应用程序增添魅力。

首先看一下效果图吧,



原理很简单,就是创建一个Dialog,Dialog有一个进度条和一个Label用来分别显示进度和进度信息,而Dialog的宽度和高度正是闪屏图片的宽度和高度。然后将闪屏图片贴到Dialog中作为整个窗体的背景,Dialog显示时覆盖闪屏所处的区域。由于Dialog显示时闪屏并没有消失,且Dialog的X、Y及宽高都与闪屏图片一致,因此实际切换时,非常流畅,用户感觉不到有异常,就像从闪屏上“长”了两个Java Swing控件出来一样,非常自然。

看一下代码调用:

Java代码



/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cn.ysh.studio.gui.window;

import javax.swing.JFrame;

import javax.swing.UIManager;

/**

*

* @author 杨胜寒

*/

public class SplashProcess {

public static void main(String args[]) {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (Exception e) {

}

//初始化闪屏Dialog时指定闪屏图片

final BackgroundDialog splashWindow = new BackgroundDialog("/cn/ysh/studio/gui/resources/splash.jpg");

//启动一个线程来加载数据

new Thread() {

@Override

public void run() {

try {

for (int i = 0; i < 10; i++) {

splashWindow.updateProcess("正在进行第" + i + "次缓存数据加载. . .", i * 9);

Thread.sleep(300);

}

} catch (InterruptedException ex) {

//异常不做处理

}

JFrame window = new MainWindow();

splashWindow.updateProcess("正在启动主窗体. . .", 100);

SwingUtils.moveToScreenCenter(window);

splashWindow.setVisible(false);

//数据加载完成,显示主窗体

window.setVisible(true);

//释放资源

splashWindow.dispose();

}

}.start();

//显示闪屏Dialog

splashWindow.setVisible(true);

}

}

上述代码分四部分, 一、设置Java Swing外观风格; 二、创建一个闪屏Dialog; 三、启动一个加载数据的线程; 四、显示闪屏Dialog

下面看看闪屏Dialog BackgroundDialog的代码

Java代码



/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cn.ysh.studio.gui.window;

import javax.swing.GroupLayout;

import javax.swing.ImageIcon;

import javax.swing.JDialog;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JProgressBar;

import javax.swing.LayoutStyle;

/**

*

* @author 杨胜寒

*/

public class BackgroundDialog extends JDialog {

private ImageIcon background;

private JProgressBar progressBar;

private JLabel progressInfo;

public BackgroundDialog(String splashPath) {

super(new JFrame(), true);

//鼠标形状为等待,告知用户程序已经在很努力的加载了,此时不可操作

setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));

//背景图片

background = new ImageIcon(BackgroundDialog.class.getResource(splashPath));

JLabel label = new JLabel(background);// 把背景图片显示在一个标签里面

//把标签的大小位置设置为图片刚好填充整个面板

label.setBounds(0, 0, background.getIconWidth(), background.getIconHeight());

//把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明

((JPanel) getContentPane()).setOpaque(false);

//初始化窗体布局

initUI();

//取消窗体默认装饰

this.setUndecorated(true);

//把背景图片添加到分层窗格的最底层作为背景

getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));

setSize(background.getIconWidth(), background.getIconHeight());

//移至屏幕中央,覆盖闪屏区域

SwingUtils.moveToScreenCenter(this);

}

/**

* 初始化窗体UI,可以在这个方法中创建复杂的UI布局

*/

private void initUI() {

progressBar = new JProgressBar();

progressInfo = new JLabel();

progressInfo.setText(" ");

progressInfo.setForeground(new java.awt.Color(204, 0, 204));

GroupLayout layout = new GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(progressBar, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 410, Short.MAX_VALUE).addComponent(progressInfo, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 410, Short.MAX_VALUE));

layout.setVerticalGroup(

layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addContainerGap(265, Short.MAX_VALUE).addComponent(progressInfo, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addComponent(progressBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)));

}

public void updateProcess(String info, int value) {

progressInfo.setText(info);

progressBar.setValue(value);

}

}

注释写的很清楚,不再赘述,且BackgroundDialog支持更复杂和更有创意的界面设计,比如动画等特效,在initUI方法中实现即可。

原创文章,转载请注明出处: /article/4079205.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: