Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)
本文将讲解如何做一个类似MyEclipse启动画面的闪屏,为Java Swing应用程序增添魅力。
首先看一下效果图吧,

原理很简单,就是创建一个Dialog,Dialog有一个进度条和一个Label用来分别显示进度和进度信息,而Dialog的宽度和高度正是闪屏图片的宽度和高度。然后将闪屏图片贴到Dialog中作为整个窗体的背景,Dialog显示时覆盖闪屏所处的区域。由于Dialog显示时闪屏并没有消失,且Dialog的X、Y及宽高都与闪屏图片一致,因此实际切换时,非常流畅,用户感觉不到有异常,就像从闪屏上“长”了两个Java Swing控件出来一样,非常自然。
看一下代码调用:
- /*
- * 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的代码
- /*
- * 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方法中实现即可。
原创文章,转载请注明出处: http://yshjava.iteye.com/blog/1326539
Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)的更多相关文章
- 为OLED屏添加GUI支持6:进度条控件
为OLED屏添加GUI支持6:进度条控件 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:MDK5.13 MCU:S ...
- C# 根据BackgroundWoker异步模型和ProgressBar控件,自定义进度条控件
前言 程序开发过程中,难免会有的业务逻辑,或者算法之类产生让人能够感知的耗时操作,例如循环中对复杂逻辑处理;获取数据库百万乃至千万级数据;http请求的时候等...... 用户在使用UI操作并不知道程 ...
- BitBlt()函数实现带数字百分比进度条控件、静态文本(STATIC)控件实现的位图进度条、自定义进度条控件实现七彩虹颜色带数字百分比
Windows API BitBlt()函数实现带数字百分比进度条控件. 有两个例子:一用定时器实现,二用多线程实现. 带有详细注解. 此例是本人原创,绝对是网上稀缺资源(本源码用Windows AP ...
- 自绘CProgressCtrl进度条控件,支持自定义显示文本和进程百分比信息
// CXProgressCtrl 头文件 #pragma once // CXProgressCtrl class CXProgressCtrl : public CProgressCtrl { D ...
- 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 ...
- Android自定义View(RollWeekView-炫酷的星期日期选择控件)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/53420889 本文出自:[openXu的博客] 目录: 1分析 2定义控件布局 3定义Cus ...
- 可以创建专业的客户端/服务器视频会议应用程序的音频和视频控件LEADTOOLS Video Conferencing SDK
LEADTOOLS Video Streaming Module控件为您创建一个自定义的视频会议应用程序和工具提供所有需要的功能.软件开发人员可以使用Video Streaming Module SD ...
- 扩展GridView实现的一个自定义无刷新分页,排序,支持多种数据源的控件TwfGridView
最近项目View层越来越趋向于无刷新化,特别是数据展示方面,还要对Linq有很好的支持.在WebFrom模式的开发中,GridView是一个功能很强大,很常用的控件,但是他也不是完美的,没有自带的无刷 ...
- 灵光一闪-VS设计界面能访问到private修饰的各种控件
大家都知道,用VS设计界面时,VS默认控件的访问修饰符为private,但是我就很奇怪,private修饰的字段不是只有类内部才能访问吗? 好神奇的VS,这到底是怎么实现的?难道就是类似文本编辑器的作 ...
随机推荐
- Unity3D开发一个2D横版射击游戏
教程基于http://pixelnest.io/tutorials/2d-game-unity/ , 这个例子感觉还是比较经典的, 网上转载的也比较多. 刚好最近也在学习U3D, 做的过程中自己又修改 ...
- 虚拟化技术学习(一)在VMware虚拟机中安装KVM
近期一直研究虚拟化技术,曾经对VMware虚拟机有一定的了解,近期突发奇想,能不能在VMware虚拟机中再装一个虚拟机呢? 那么问题就来了,首先,你须要一台电脑,vmware软件,(本人的电脑配置渣渣 ...
- 动态加载资源文件(ResourceDictionary)
原文:动态加载资源文件(ResourceDictionary) 在xaml中控件通过绑定静态资源StaticResource来获取样式Style有多种方式: 1.在项目的启动文件App中<App ...
- meta标签详解:源http://blog.csdn.net/kongjiea/article/details/17092413
一.大众机型常用meta标签name的设置 1.name之viewport <meta name="viewport" content=""> 说明 ...
- IP Camera 和 Web Camera 差分
一直以来,,没太注意IP camera 和 Web Camera之间的差,这两个摄像头,昨天晚上.闲来无事Google少数,我们发现,还有两者之间的差异. 1) IP Camera IP Camera ...
- 三种方法让你的Service不被“一键加速”和系统杀掉
基本上大家都知道提高service优先级能够在非常大程度上让你的service免于由于内存不足而被kill,当然系统仅仅是在此时先把优先级低的kill掉,假设内存还是不够,也会把你的service干掉 ...
- 阅读:AirBag Boosting Smartphone Resistance to Malware Infection
- 更具体的描述JNI
JNI事实上,Java Native Interface缩写,也就是说,java本地接口. 它提供了许多API实现和Java并与其他语言的沟通(主要C&C++). 也许很多人认为Java够劲. ...
- 玩转web之ajax(一)---使用表单的serialize()方法中文乱码解决
有时候我们需要使用ajax提交去提交form的值,这样就需要使用serialize()去获取form的值,但这样获取的值如果有中文,会乱码,原因和解决方法如下: 原因:.serialize()自动调用 ...
- cer, pfx 创建,而且读取公钥/密钥,加解密 (C#程序实现)
PKI技术(public key infrastructure)里面,cer文件和pfx文件是非经常见的.通常cer文件中面保存着公钥以及用户的一些信息,pfx里面则含有私钥和公钥. 用makecer ...