Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)
2024-08-20 16:11:20
本文将讲解如何做一个类似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
最新文章
- 二模 (1) day2
- uboot 顶层makefile细节分析
- 2014年度辛星全然解读html第七节
- HTML学习(八)列表和块
- 蓝桥杯-四平方和-java
- mysql中varchar和char区别(思维导图整理)
- Spring Boot(十四)RabbitMQ延迟队列
- 关于 chrome canary X64 在 win7 64bit 下面缺少openvr_api.dll的解决方法
- CC攻击原理及防范方法
- PostgreSQL事务实现
- Vue动态新增对象属性
- 关于video.js不错的一篇博客,
- 【Selenium-WebDriver自学】出现的问题和解决方案(十七)
- 常见CSS
- springmvc接收jquery提交的数组数据
- 【noip模拟赛1】古韵之同心锁
- C#------如何处理缺少对公共可见类型或成员的xml注释的警告
- css 多行文字,超出部分隐藏,...代替
- 2743: [HEOI2012]采花
- sicily 1001. Fibonacci 2
热门文章
- ASP.NET 成员资格 Part.2(使用安全控件 Login)
- Eclipse怎么显示行号,定位某行
- Unity UGUI——开源
- [LeetCode]Word Ladder 最短距离字符串转换 (Dijkstra)
- POJ 1915-Knight Moves (单向BFS &;amp;&;amp; 双向BFS 比)
- 【Linux探索之旅】第二部分第一课:终端Terminal,好戏上场
- 【Spring】Spring学习笔记-01-入门级实例
- Vbox创建COM对象失败
- datagrid直接编辑保存“设计缺陷”
- Python学习笔记20:server先进