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

 

本文将讲解如何做一个类似MyEclipse启动画面的闪屏,为Java Swing应用程序增添魅力。

 

首先看一下效果图吧,

 

 

 

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

 

看一下代码调用:

 

Java代码   收藏代码
  1. /* 
  2.  * To change this template, choose Tools | Templates 
  3.  * and open the template in the editor. 
  4.  */  
  5. package cn.ysh.studio.gui.window;  
  6.   
  7. import javax.swing.JFrame;  
  8. import javax.swing.UIManager;  
  9.   
  10. /** 
  11.  * 
  12.  * @author 杨胜寒 
  13.  */  
  14. public class SplashProcess {  
  15.   
  16.     public static void main(String args[]) {  
  17.         try {  
  18.             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());  
  19.         } catch (Exception e) {  
  20.         }  
  21.         //初始化闪屏Dialog时指定闪屏图片  
  22.         final BackgroundDialog splashWindow = new BackgroundDialog("/cn/ysh/studio/gui/resources/splash.jpg");  
  23.         //启动一个线程来加载数据  
  24.         new Thread() {  
  25.             @Override  
  26.             public void run() {  
  27.                 try {  
  28.                     for (int i = 0; i < 10; i++) {  
  29.                         splashWindow.updateProcess("正在进行第" + i + "次缓存数据加载. . .", i * 9);  
  30.                         Thread.sleep(300);  
  31.                     }  
  32.                 } catch (InterruptedException ex) {  
  33.                     //异常不做处理  
  34.                 }  
  35.                 JFrame window = new MainWindow();  
  36.                 splashWindow.updateProcess("正在启动主窗体. . .", 100);  
  37.                 SwingUtils.moveToScreenCenter(window);  
  38.                 splashWindow.setVisible(false);  
  39.                 //数据加载完成,显示主窗体  
  40.                 window.setVisible(true);  
  41.                 //释放资源  
  42.                 splashWindow.dispose();  
  43.             }  
  44.         }.start();  
  45.         //显示闪屏Dialog  
  46.         splashWindow.setVisible(true);  
  47.     }  
  48. }  

 

 

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

 

下面看看闪屏Dialog BackgroundDialog的代码

 

Java代码   收藏代码
  1. /* 
  2.  * To change this template, choose Tools | Templates 
  3.  * and open the template in the editor. 
  4.  */  
  5. package cn.ysh.studio.gui.window;  
  6.   
  7. import javax.swing.GroupLayout;  
  8. import javax.swing.ImageIcon;  
  9. import javax.swing.JDialog;  
  10. import javax.swing.JFrame;  
  11. import javax.swing.JLabel;  
  12. import javax.swing.JPanel;  
  13. import javax.swing.JProgressBar;  
  14. import javax.swing.LayoutStyle;  
  15.   
  16. /** 
  17.  * 
  18.  * @author 杨胜寒 
  19.  */  
  20. public class BackgroundDialog extends JDialog {  
  21.   
  22.     private ImageIcon background;  
  23.     private JProgressBar progressBar;  
  24.     private JLabel progressInfo;  
  25.   
  26.     public BackgroundDialog(String splashPath) {  
  27.         super(new JFrame(), true);  
  28.         //鼠标形状为等待,告知用户程序已经在很努力的加载了,此时不可操作  
  29.         setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));  
  30.         //背景图片  
  31.         background = new ImageIcon(BackgroundDialog.class.getResource(splashPath));  
  32.         JLabel label = new JLabel(background);// 把背景图片显示在一个标签里面  
  33.         //把标签的大小位置设置为图片刚好填充整个面板  
  34.         label.setBounds(0, 0, background.getIconWidth(), background.getIconHeight());  
  35.         //把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明  
  36.         ((JPanel) getContentPane()).setOpaque(false);  
  37.         //初始化窗体布局  
  38.         initUI();  
  39.         //取消窗体默认装饰  
  40.         this.setUndecorated(true);  
  41.         //把背景图片添加到分层窗格的最底层作为背景  
  42.         getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));  
  43.         setSize(background.getIconWidth(), background.getIconHeight());  
  44.         //移至屏幕中央,覆盖闪屏区域  
  45.         SwingUtils.moveToScreenCenter(this);  
  46.     }  
  47.   
  48.     /** 
  49.      * 初始化窗体UI,可以在这个方法中创建复杂的UI布局 
  50.      */  
  51.     private void initUI() {  
  52.         progressBar = new JProgressBar();  
  53.         progressInfo = new JLabel();  
  54.         progressInfo.setText(" ");  
  55.         progressInfo.setForeground(new java.awt.Color(204, 0, 204));  
  56.         GroupLayout layout = new GroupLayout(getContentPane());  
  57.         getContentPane().setLayout(layout);  
  58.         layout.setHorizontalGroup(  
  59.                 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));  
  60.         layout.setVerticalGroup(  
  61.                 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)));  
  62.   
  63.     }  
  64.   
  65.     public void updateProcess(String info, int value) {  
  66.         progressInfo.setText(info);  
  67.         progressBar.setValue(value);  
  68.     }  
  69. }  

 

 

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

 

 

原创文章,转载请注明出处: http://yshjava.iteye.com/blog/1326539

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值