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

首先看一下效果图吧,

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

看一下代码调用:

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

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

下面看看闪屏Dialog BackgroundDialog的代码

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

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

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

Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)的更多相关文章

  1. 为OLED屏添加GUI支持6:进度条控件

    为OLED屏添加GUI支持6:进度条控件 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:MDK5.13 MCU:S ...

  2. C# 根据BackgroundWoker异步模型和ProgressBar控件,自定义进度条控件

    前言 程序开发过程中,难免会有的业务逻辑,或者算法之类产生让人能够感知的耗时操作,例如循环中对复杂逻辑处理;获取数据库百万乃至千万级数据;http请求的时候等...... 用户在使用UI操作并不知道程 ...

  3. BitBlt()函数实现带数字百分比进度条控件、静态文本(STATIC)控件实现的位图进度条、自定义进度条控件实现七彩虹颜色带数字百分比

    Windows API BitBlt()函数实现带数字百分比进度条控件. 有两个例子:一用定时器实现,二用多线程实现. 带有详细注解. 此例是本人原创,绝对是网上稀缺资源(本源码用Windows AP ...

  4. 自绘CProgressCtrl进度条控件,支持自定义显示文本和进程百分比信息

    // CXProgressCtrl 头文件 #pragma once // CXProgressCtrl class CXProgressCtrl : public CProgressCtrl { D ...

  5. atitit. 文件上传带进度条 atiUP 设计 java c# php

    atitit. 文件上传带进度条 atiUP 设计 java c# php 1. 设计要求 1 2. 原理and 架构 1 3. ui 2 4. spring mvc 2 5. springMVC.x ...

  6. Android自定义View(RollWeekView-炫酷的星期日期选择控件)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/53420889 本文出自:[openXu的博客] 目录: 1分析 2定义控件布局 3定义Cus ...

  7. 可以创建专业的客户端/服务器视频会议应用程序的音频和视频控件LEADTOOLS Video Conferencing SDK

    LEADTOOLS Video Streaming Module控件为您创建一个自定义的视频会议应用程序和工具提供所有需要的功能.软件开发人员可以使用Video Streaming Module SD ...

  8. 扩展GridView实现的一个自定义无刷新分页,排序,支持多种数据源的控件TwfGridView

    最近项目View层越来越趋向于无刷新化,特别是数据展示方面,还要对Linq有很好的支持.在WebFrom模式的开发中,GridView是一个功能很强大,很常用的控件,但是他也不是完美的,没有自带的无刷 ...

  9. 灵光一闪-VS设计界面能访问到private修饰的各种控件

    大家都知道,用VS设计界面时,VS默认控件的访问修饰符为private,但是我就很奇怪,private修饰的字段不是只有类内部才能访问吗? 好神奇的VS,这到底是怎么实现的?难道就是类似文本编辑器的作 ...

随机推荐

  1. fragment android

    在Eoe中看到了 一个关于的 详细讲解,相信对 学Fragment 有帮助 android fragment基础与源码案例: Fragment动画效果 http://www.eoeandroid.co ...

  2. 【Cocos2d-x 粒子系统】火球用手指飞起来

    程序: 创建球 sp1 = CCSprite::create("ball.png"); sp1->setPosition(ccp(10, visibleSize.height ...

  3. ByteBuffer的allocate和allocateDirect

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

  4. NET 分布式架构开发项目实战

    .NET 分布式架构开发项目实战 从头到尾,一步一步讲述一个真实的项目实战,关注点主要是架构的思考和实现,以及如何解决平时项目遇到的一些问题. 同时也司公布源代码. 如何构建高性能,稳定SOA应用之- ...

  5. STL顺序容器【vector】【deque】【list】

    我们都知道,stl在集装箱船分为两类,订购集装箱和相关的容器. 顺序容器有三种即动态数组vector,双端队列deque,以及链表list (对csdn的文字排版严重吐槽.写好的版发表了就变了) 一: ...

  6. 【Win7】【磁盘管理】删除相似“33fbc1d57e9aaf1ea88e6f08”缓存目录

    一般,在计算机磁盘.移动硬盘.或U盘出现,类别似"33fbc1d57e9aaf1ea88e6f08",你不能删除缓存目录.能Win7删除. (1).使用管理员,打开命令提示符窗口( ...

  7. vim代码折叠命令简短

    作者:zhanhailiang 日期:2014-10-18 1. 通过fdm实现代码折叠:set fdm=xxx 有下面6种方式实现折叠: |fold-manual| manual Folds are ...

  8. java自学者的福音

    谈到自学对于程序员来说并不陌生,自从我们离开校门就开始了自学之路.这一路上绝大部分都是 百步止于九十 步, 不是因为他们不够坚持,而是没有找到学习的方法和资源.当然这一路上我也走得很辛苦,刚毕业后自学 ...

  9. 【Android进阶】Android面试题目整理与讲解(一)

    这一篇文章专门整理一下研究过的Android面试题,内容会随着学习不断的增加,如果答案有错误,希望大家可以指正 1.简述Activity的生命周期 当Activity开始启动的时候,首先调用onCre ...

  10. Android TextView里直接显示图片的三种方法

    方法一:重写TextView的onDraw方法,也挺直观就是不太好控制显示完图片后再显示字体所占空间的位置关系.一般假设字体是在图片上重叠的推荐这样写.时间关系,这个不付源代码了. 方法二:利用Tex ...