Swing应用开发实战系列之三:动态信息提示窗口

时间:2023-01-27 21:38:57

 

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

Swing应用开发实战系列之三:动态信息提示窗口

 

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

 

【完】

作者:商兵兵

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

QQ:52190634

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

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