• 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

  • 相关阅读:
    POJ
    CodeForces
    51Nod 1256 扩展欧几里得求乘法逆元
    SDUT 3917
    SDUT 3918
    从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程
    bootstrap资料索引
    理解Login函数
    细说@Html.ActionLink()的用法
    RGB颜色对照表
  • 原文地址:https://www.cnblogs.com/softidea/p/4735016.html
Copyright © 2020-2023  润新知