这里所说的“动态信息提示窗口”可不同于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