服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

等待窗体的一种实现

   在很多应用中,如果某一处理需要花费的时间比较长,应用应该提供一个比较人性化的提示。如果这个处理是由一个循环来实现的,则可以采用一个任务进度提示,其它情况可能就采用弹出一个类似于"系统正在处理,请稍后..."提示框的方式来达到目的。以下的代码简单实现了这一功能:

package test;
import javax.swing.*;
import java.awt.*;
import com.borland.jbcl.layout.*;
import javax.swing.border.*;

class progresspanel extends jpanel {
  jlabel jtip = new jlabel();
  jprogressbar jprogress = new jprogressbar();
  xylayout xylayout1 = new xylayout();
  titledborder titledborder1;
  public progresspanel() {
    try {
      jbinit();
    }
    catch(exception e) {
      e.printstacktrace();
    }
  }
  public static void main(string[] args) {
    progresspanel progresspanel1 = new progresspanel();
  }
  private void jbinit() throws exception {
    titledborder1 = new titledborder("");
    jtip.settext("处理中...");
    jtip.setfont(new java.awt.font("dialog", 0, 12));
    this.setlayout(xylayout1);
    jprogress.setorientation(jprogressbar.horizontal);
    jprogress.setforeground(new color(0, 0, 105));
    jprogress.setborder(borderfactory.createloweredbevelborder());
    jprogress.setstringpainted(true);
    xylayout1.setwidth(258);
    xylayout1.setheight(75);
    this.setdebuggraphicsoptions(0);
    this.add(jtip, new xyconstraints(10, 1, -1, -1));
    this.add(jprogress,       new xyconstraints(5, 16, 249, 24));
  }
}

package test;
import java.awt.window;
import java.awt.dimension;
import java.awt.toolkit;
import javax.swing.jframe;
import javax.swing.jlabel;
import java.awt.rectangle;
import javax.swing.swingconstants;
import java.awt.gridbaglayout;

public class waitingframe {
    protected static window wininc;
    private static waitingframe inc;

    private static jlabel jwaittip;
    private static progresspanel propanel;

    private static final string waiting_tip = "系统正在处理中,请稍后.....";
    private static final string progress_tip = "处理中...";

    private static final int default_width = 260;
    private static final int default_height = 45;

    private static int default_locatex;
    private static int default_locatey;

    private static boolean resetflg = false;

    private static int maxprogress = 100;
    //当前显示的窗口类型
    private int curtype;

    /**
     * 等待窗口
     */
    public static final int waiting = 0;

    /**
     * 进度条窗口
     */
    public static final int progress = 1;

    private waitingframe() {
    }

    /**
     * 获取提示窗口实例
     * @param atype:窗口类型
     * @return
     */
    public synchronized static waitingframe getinstance(int atype){
        if(atype==progress){
            if(null==propanel){
                propanel = new progresspanel();
            }
        }else{
            if(null==jwaittip){
                jwaittip = new jlabel();
                jwaittip.setfont(new java.awt.font("dialog", 0, 16));
                jwaittip.sethorizontalalignment(swingconstants.center);
                jwaittip.settext(waiting_tip);
                jwaittip.setbounds(new rectangle(0, 0, 280, 98));
            }
        }
        if(null==inc){
            inc = new waitingframe();
            jframe frm = new jframe();
            frm.getcontentpane().setlayout(new gridbaglayout());
            wininc = new window(frm);
            if(atype==progress){
                inc.curtype = atype;
                propanel.jprogress.setmaximum(maxprogress);
                propanel.jprogress.setvalue(0);
                wininc.add(propanel);
            }else{
                inc.curtype = waiting;
                wininc.add(jwaittip);
            }
            wininc.setsize(default_width,default_height);
            dimension syssize = toolkit.getdefaulttoolkit().getscreensize();
            default_locatex = (syssize.width-default_width)/2;
            default_locatey = (syssize.height-default_height)/2;;
        }else{
            if (atype == progress) {
                wininc.removeall();
                propanel.jtip.settext(progress_tip);
                propanel.jprogress.setvalue(0);
                wininc.add(propanel);
            }
            else {
                wininc.removeall();
                jwaittip.settext(waiting_tip);
                wininc.add(jwaittip);
            }
        }
        inc.curtype = atype;
        inc.resetflg = false;
        return inc;
    }


    /**
     * 关闭显示的等待窗口
     */
    public void close(){
        if(null!=wininc && wininc.isshowing())
            wininc.dispose();
    }

    /**
     * 关闭显示的等待窗口
     */
    public void dispose(){
        close();
    }

    /**
     * 设置提示文本
     * @param atip:提示文本
     */
    public void settip(string atip){
        if(this.curtype==progress){
            propanel.jtip.settext(atip);
        }else{
            jwaittip.settext(atip);
        }
        resetflg = true;
        wininc.validate();
    }

    /**
     * 设置进度条的最大值
     * @param avalue 最大值
     */
    public void setmaxvalue(int avalue){
        if (curtype == progress) {
            if(avalue>0)
                maxprogress = avalue;
            else
                maxprogress = 100;
            propanel.jprogress.setmaximum(maxprogress);
        }
        else {
            throw new runtimeexception("等待窗口不支持此函数,只有进度条窗口才支持!");
        }
    }

    /**
     * 设置当前进度
     * @param avalue 当前进度值
     */
    public void setprogress(int avalue){
        propanel.jprogress.setvalue(avalue);
        wininc.validate();
    }

    /**
     * 显示窗口
     * @param atiptext 文本提示
     * @param alocx 窗口位置x
     * @param alocy 窗口位置y
     */
    public void show(string atiptext,int alocx,int alocy){
        settip(atiptext);
        wininc.setlocation(alocx,alocy);
        wininc.show();
    }

    /**
     * 显示窗口
     * @param atiptext 文本提示
     */
    public void show(string atiptext){
        show(atiptext,this.default_locatex,this.default_locatey);
    }

    /**
     * 显示窗口
     * @param alocx 窗口位置x
     * @param alocy 窗口位置y
     */
    public void show(int alocx,int alocy){
        if(curtype==progress)
            show(this.progress_tip,alocx,alocy);
        else
            show(this.waiting_tip,alocx,alocy);
    }

    /**
     * 显示窗口
     */
    public void show(){
        if(resetflg){
            if(curtype==progress)
                show(propanel.jtip.gettext(),this.default_locatex,this.default_locatey);
            else
                show(jwaittip.gettext(),this.default_locatex,this.default_locatey);
        }else{
            if(curtype==progress)
                show(this.progress_tip,this.default_locatex,this.default_locatey);
            else
                show(this.waiting_tip,this.default_locatex,this.default_locatey);
        }
    }

    public static void main(string[] args) {
      //进度条测试
        waitingframe frm = waitingframe.getinstance(waitingframe.progress);
        frm.setmaxvalue(100);
        frm.show();
        int i = 0;
        while (i++ < 100) {
            frm.setprogress(i);
            try {
                thread.sleep(100);
            }
            catch (interruptedexception ex) {
            }

        }
        frm.dispose();

       //等待窗体测试
        frm = waitingframe.getinstance(waitingframe.waiting);
        frm.show();
        try {
          thread.sleep(10000);
        }
        catch (interruptedexception ex1) {
        }
        frm.dispose();
    }
}

扫描关注微信公众号