这里所说的“动态信息提示窗口”可不同于JOptionPane中的Message窗口和Confirm窗口,它们都是静态的模态的,更重要的是线程阻塞的,迫使你必须选择某个动作才能继续执行。我们接下来要分享的这个动态信息提示窗口,重点就是信息是动态的且实时刷新显示的,我们设想这样一个应用场景,当我们要向数据库中写入10000条记录时,这肯定是一个颇为耗时的工作,很有必要在前台界面中实时地告知用户数据写入进度,并在写入完成后,自动隐藏提示窗口。

首先,设计信息提示窗体,调整到适当大小,并将窗口属性alwaysOnTop设置为true,保证其不会被其他窗口遮挡。文件名称为DialogHintInfo.java,具体代码如下表所示:

  1. import java.awt.Color;
  2. import javax.swing.JDialog;
  3. import javax.swing.JScrollPane;
  4. import javax.swing.JPanel;
  5. import javax.swing.BoxLayout;
  6. import javax.swing.JTextField;
  7. import javax.swing.SwingConstants;
  8. import java.awt.Font;
  9. /**
  10. * Description: 信息提示窗体<br>
  11. * Copyright: Copyright (c) 2015<br>
  12. * Company: 河南电力科学研究院智能电网所<br>
  13. * @author shangbingbing 2015-07-01编写
  14. * @version 1.0
  15. */
  16. public class DialogHintInfo extends JDialog {
  17. private static final long serialVersionUID = 1L;
  18. private JPanel pnlClient;
  19. private JScrollPane scrollPane;
  20. private JTextField txtHintInfo;
  21. /**
  22. * 加载显示提示信息
  23. * @param hintInfo
  24. */
  25. public void setHintInfo(String hintInfo) {
  26. this.txtHintInfo.setText(hintInfo);
  27. this.txtHintInfo.paintImmediately(this.txtHintInfo.getBounds());
  28. }
  29. public DialogHintInfo() {
  30. setAlwaysOnTop(true);
  31. setResizable(false);
  32. setTitle("\u7CFB\u7EDF\u63D0\u793A");
  33. setBounds(100, 100, 394, 151);
  34. getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
  35. pnlClient = new JPanel();
  36. getContentPane().add(pnlClient);
  37. pnlClient.setLayout(new BoxLayout(pnlClient, BoxLayout.X_AXIS));
  38. scrollPane = new JScrollPane();
  39. pnlClient.add(scrollPane);
  40. txtHintInfo = new JTextField();
  41. txtHintInfo.setEditable(false);
  42. txtHintInfo.setForeground(Color.BLUE);
  43. txtHintInfo.setFont(new Font("宋体", Font.PLAIN, 14));
  44. txtHintInfo.setHorizontalAlignment(SwingConstants.CENTER);
  45. txtHintInfo.setText("\u63D0\u793A\u4FE1\u606F");
  46. scrollPane.setViewportView(txtHintInfo);
  47. txtHintInfo.setColumns(10);
  48. }
  49. }

其次,设计如何调用显示信息提示窗体。可以将DialogHintInfo声明为全局静态对象(同时在多个页面调用的话会出现一些问题),也可以在某个母版窗口中声明DialogHintInfo对象(所有继承自此母版的窗口都可以调用信息提示窗体,且互相不影响),你可以根据自己的需要进行选择,这里是将DialogHintInfo声明为全局静态对象,具体代码如下表所示:

  1. private static DialogHintInfo dialogHintInfo = new DialogHintInfo();
  2. /**
  3. * 加载显示提示信息
  4. */
  5. public static void showHintInfo(String hintInfo) {
  6. SwingLayoutUtil.setDialogScreenCenter(dialogHintInfo);
  7. dialogHintInfo.setVisible(true);
  8. dialogHintInfo.setTitle("系统提示");
  9. dialogHintInfo.setHintInfo(hintInfo);
  10. }
  11. /**
  12. * 更新提示信息
  13. */
  14. public static void updateHintInfo(String hintInfo) {
  15. dialogHintInfo.setHintInfo(hintInfo);
  16. }
  17. /**
  18. * 隐藏提示信息
  19. */
  20. public static void hindHintInfo() {
  21. dialogHintInfo.setVisible(false);
  22. }
  23. /**
  24. * 显示提示信息,2秒后自动消失。
  25. * @param hintInfo
  26. */
  27. public static void showHintInfoDefaultDelay(String hintInfo) {
  28. showHintInfo(hintInfo, 2);
  29. }
  30. /**
  31. * 显示提示信息,延时指定秒数后自动消失。
  32. * @param hintInfo
  33. * @param delaySeconds
  34. */
  35. public static void showHintInfo(String hintInfo, int delaySeconds) {
  36. try {
  37. //将窗口保持在屏幕中间显示
  38. SwingLayoutUtil.setDialogScreenCenter(dialogHintInfo);
  39. dialogHintInfo.setVisible(true);
  40. dialogHintInfo.setTitle(String.format("系统提示【%d秒后关闭】", delaySeconds));
  41. dialogHintInfo.setHintInfo(hintInfo);
  42. Thread.sleep(delaySeconds * 1000);
  43. } catch (Exception ex) {
  44. ex.printStackTrace();
  45. } finally {
  46. hindHintInfo();
  47. }
  48. }

应用实例,请参考下面的代码和运行效果图。

  1. public static void main(String[] args) {
  2. try {
  3. //调用显示信息提示窗口时,请务必在try中,以shwoHintInfo(“”)显示提示窗口;
  4. //并将hindHintInfo()方法卸载finally中,以保证最终能够隐藏掉提示窗口。
  5. showHintInfo("");
  6. for(int i=1; i<10; i++) {
  7. updateHintInfo("当前进度:" + String.valueOf(i));
  8. Thread.sleep(1000);
  9. }
  10. } catch (Exception ex) {
  11. ex.toString();
  12. } finally {
  13. hindHintInfo();
  14. }
  15. }

当然,你也可以发挥你的想象力,设计出更加个性化的动态信息提示窗口,譬如定时关闭型的、进度条显示型的等等。

【完】

作者:商兵兵

单位:河南省电力科学研究院智能电网所

QQ:52190634

主页:http://www.cnblogs.com/shangbingbing

空间:http://shangbingbing.qzone.qq.com

Swing应用开发实战系列之三:动态信息提示窗口的更多相关文章

  1. Swing应用开发实战系列之一:自定义JdbcTemplate

    笔者本人真正意义上接触编程开发是在2004年,最早用的就是VB,然后是Delphi等,后来转到.Net,中间断断续续还用过PowerBuilder等,无一例外,所研发设计的项目或系统都是WinForm ...

  2. Swing应用开发实战系列之五:后台日志信息前台监控器

    作为一个程序设计人员,我们深知日志的重要性,对于日志的监控,我们通常不外乎采用以下两种方式:日志文件方式和后台打印方式,常规情况下,这两种日志监控方式完全可以满足我们对日志监控的需要.但是,当我们用S ...

  3. Swing应用开发实战系列之四:组件内容实时刷新问题

    窗口组件动态刷新问题,在dotnet中根本不算什么问题,用几句代码很轻松就能搞定,但是在Swing中,实现动态刷新组件内容却是一件颇为吃力的事情.譬如针对我们经常用到的刷新JLable.JTextFi ...

  4. Swing应用开发实战系列之二:设计日期选择面板窗口

    Swing本身没有提供什么华丽丽的日期时间选择控件,所以笔者就在网上搜了个第三方的jar包jdatepicker-1.3.2.jar,基于此设计了个很轻量的日期选择面板,很简单的.效果图如下所示: 代 ...

  5. WCF开发实战系列一:创建第一个WCF服务

    WCF开发实战系列一:创建第一个WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在这个实战中我们将使用DataContract,ServiceContract ...

  6. WCF开发实战系列二:使用IIS发布WCF服务

    WCF开发实战系列二:使用IIS发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS200 ...

  7. WCF开发实战系列三:自运行WCF服务

    WCF开发实战系列三:自运行WCF服务 (原创:灰灰虫的家 http://hi.baidu.com/grayworm)上一篇文章中我们建立了一个WCF服务站点,为WCF服务库运行提供WEB支持,我们把 ...

  8. WCF开发实战系列四:使用Windows服务发布WCF服务

    WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...

  9. WCF开发实战系列五:创建WCF客户端程序

    WCF开发实战系列五:创建WCF客户端程序 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在前面的三篇文章中我们分别介绍了WCF服务的三种载体:IIS.Self-Hos ...

随机推荐

  1. Scrum 项目 7.0

    ------------------7.0------------------------------ Sprint回顾 1.回顾组织 主题:“我们怎样才能在下个sprint中做的更好?” 时间:设定 ...

  2. P6 EPPM 16.1 安装和配置指南 1

    安装和配置指南下一topiccontents这些指南解释如何安装和配置数据库服务器,和P6 EPPM,模块:他们还提供在P6 EPPM能够解决所有模块的概述.标准指南帮助您配置和部署应用程序向导P6 ...

  3. 【循序渐进学Python】2. Python中的序列——列表和元组

    序列概览 在Python中有六种内建的序列:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.在这里暂时只讨论列表和元组.列表和元组的主要区别在于:列表可以修改,元组(不可 ...

  4. Winform调用QQ发信息并且开机启动 (开源)

    前言 公司CS系统需要加入启动qq从winform调用qq聊天窗口的功能,前提是需要将聊天者的QQ号码作为参数传递到函数中,一直没有搞过,正好很感兴趣,就折腾,Winform调用qq,我想肯定是需要一 ...

  5. visual studio 2013 配置开发环境

    https://www.visualstudio.com/explore/xamarin-vs http://sourceforge.net/projects/easyeclipse/files/?s ...

  6. sql: sq_helptext

    --查看表生成脚本 sql server     --- '\r'是回车,'\n'是换行  /t相当于键盘的Tab键    --- 操作系统的不同,换行符操也不同:/r Mac /n Unix/Lin ...

  7. Json Utils

    import java.util.List;import java.util.Map; import net.sf.json.JSONArray;import net.sf.json.JSONObje ...

  8. LinQ实战学习笔记(四) LINQ to Object, 常用查询操作符

    这一篇介绍了下面的内容: 查询object数组 查询强类型数组 查询泛型字典 查询字符串 SelectMany 索引 Distinct操作符 排序 嵌套查询 分组 组连接 内连接 左外连接 交叉连接 ...

  9. mybatis3批量更新 批量插入

    在公司ERP项目开发中,遇到批量数据插入或者更新,因为每次连接数据库比较耗时,所以决定改为批量操作,提升效率.库存盘点导入时,需要大量数据批量操作. 1:数据库连接代码中必须开启批量操作.加上这句,& ...

  10. js 操作ASP.NET服务器控件

    js 操作ASP.NET服务器控件 在ASP.NET中使用js时,js获取DOM元素时,经常获取不到,这是因为获取的方法有误,现在介绍一方法,解决如何使用js获取ASP.NET控件在浏览器端生成htm ...