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

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

import java.awt.Color;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JPanel;
import javax.swing.BoxLayout;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import java.awt.Font;
/**
* Description: 信息提示窗体<br>
* Copyright: Copyright (c) 2015<br>
* Company: 河南电力科学研究院智能电网所<br>
* @author shangbingbing 2015-07-01编写
* @version 1.0
*/
public class DialogHintInfo extends JDialog {
private static final long serialVersionUID = 1L;
private JPanel pnlClient;
private JScrollPane scrollPane;
private JTextField txtHintInfo;
/**
* 加载显示提示信息
* @param hintInfo
*/
public void setHintInfo(String hintInfo) {
this.txtHintInfo.setText(hintInfo);
this.txtHintInfo.paintImmediately(this.txtHintInfo.getBounds());
}
public DialogHintInfo() {
setAlwaysOnTop(true);
setResizable(false);
setTitle("\u7CFB\u7EDF\u63D0\u793A");
setBounds(100, 100, 394, 151);
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
pnlClient = new JPanel();
getContentPane().add(pnlClient);
pnlClient.setLayout(new BoxLayout(pnlClient, BoxLayout.X_AXIS));
scrollPane = new JScrollPane();
pnlClient.add(scrollPane);
txtHintInfo = new JTextField();
txtHintInfo.setEditable(false);
txtHintInfo.setForeground(Color.BLUE);
txtHintInfo.setFont(new Font("宋体", Font.PLAIN, 14));
txtHintInfo.setHorizontalAlignment(SwingConstants.CENTER);
txtHintInfo.setText("\u63D0\u793A\u4FE1\u606F");
scrollPane.setViewportView(txtHintInfo);
txtHintInfo.setColumns(10);
}
}

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

private static DialogHintInfo dialogHintInfo = new DialogHintInfo();
/**
* 加载显示提示信息
*/
public static void showHintInfo(String hintInfo) {
SwingLayoutUtil.setDialogScreenCenter(dialogHintInfo);
dialogHintInfo.setVisible(true);
dialogHintInfo.setTitle("系统提示");
dialogHintInfo.setHintInfo(hintInfo);
}
/**
* 更新提示信息
*/
public static void updateHintInfo(String hintInfo) {
dialogHintInfo.setHintInfo(hintInfo);
}
/**
* 隐藏提示信息
*/
public static void hindHintInfo() {
dialogHintInfo.setVisible(false);
}
/**
* 显示提示信息,2秒后自动消失。
* @param hintInfo
*/
public static void showHintInfoDefaultDelay(String hintInfo) {
showHintInfo(hintInfo, 2);
}
/**
* 显示提示信息,延时指定秒数后自动消失。
* @param hintInfo
* @param delaySeconds
*/
public static void showHintInfo(String hintInfo, int delaySeconds) {
try {
//将窗口保持在屏幕中间显示
SwingLayoutUtil.setDialogScreenCenter(dialogHintInfo);
dialogHintInfo.setVisible(true);
dialogHintInfo.setTitle(String.format("系统提示【%d秒后关闭】", delaySeconds));
dialogHintInfo.setHintInfo(hintInfo);
Thread.sleep(delaySeconds * 1000);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
hindHintInfo();
}
}

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

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

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

【完】

作者:商兵兵

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

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. 12 19 spring3 项目总结

    项目截图: 林集团 https://home.cnblogs.com/u/linjituan/ 团队guihub: https:///github.com/MoiGi 李鹏飞 https://www. ...

  2. Ubuntu搭建Android交叉编译环境

    一.下载 Android NDK Android NDK官方下载页:http://developer.android.com/tools/sdk/ndk/index.html如果需要旧版本的,比如10 ...

  3. .net 读书笔记

    好书不能只读一遍,这两天又翻看了一遍<你必须知道的.NET>,重温了下基础,重温了下经典,简单记录了下来. 内存分配:CLR 管理内存的区域,主要有三块,分别为: 线程的堆栈,用于分配值类 ...

  4. IIS启动网站出错的几个解决方法

    在ASP.NET项目中使用了IIS服务器,由于系统是XP的,而在装系统的时候IIS没有一起装,所以从网上下载的IIS5.0版本(其它版本XP是用不了的).但是在使用的过程中老是出问题,每次调试好后,过 ...

  5. [CLR via C#]14. 字符、字符串和文本处理

    一.字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构(一个值类型) 的一个实例.System ...

  6. 【JS复习笔记】00 序

    作为一个前端苦手,说是复习,你就当我是重学好了. 好吧,我当然不可能抱着一个砖头去复习,所以捡了本薄的来读——<JavaScript语言精粹>. 当初带我的人说这本书挺好,就看这本书好了. ...

  7. 运行QQ出现initialization failure 0x0000000c错误和浏览器上不了网

    出现QQ出现initialization failure 0x0000000c错误和浏览器上不了网的问题,原因是关机的时候没有正常关闭导致的. 解决方法: 1.我们在开始菜单栏中的附件中找到“命令提示 ...

  8. 操作AppConfig.xml中AppSettings对应值字符串

    //查询AppSettings的key         public static List sql()         {             List list = new List();   ...

  9. PHPWind 8.7中代码结构与程序执行顺序

    pw9在此不谈,他是完全重构的作品,是完全MVC下的体系.当然,其中很多东西在PW8.7下已经可见端倪. 主要代码结构 1. 以现代的观点,PW是多入口应用模式,程序根目录下的文件几乎都是入口: 2. ...

  10. Linux Shell系列教程之(十五) Shell函数简介

    本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell系列教程 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高 ...