Java实现软件运行时启动信息窗口的方法
本文实例形式详述了Java实现一个程序运行时的启动窗口效果,如常用的MicrosoftWord、BorlandJBuilder等,这样的窗口称为信息窗口。使用信息窗口的好处是可以使用户在等待软件主界面出现前的一段时间中得知软件运行状态。本例将演示如何来实现信息窗口,当打开程序时,信息窗口先显示,并在窗口上倒计时,直到“waiting0”时,关闭该窗口,显示程序的主窗口。
该功能的主要实现方法如下:
一般来说,大多数的信息窗口是没有标题栏的,因此信息窗口不能由继承JFrame类来实现,一种简单的做法是通过继承JWindow来实现(当然继承Window类也可以,但一个原则是尽量使用swing中的界面
类)。另外,本例用到java.awt包中的MediaTracker类。使用该类的好处是可以更好地管理程序中要使用的图片,同时还可以保证图片和界面同时显示,避免了窗口显示后很久才显示图片的缺点。
具体操作步骤如下:
1.新建一个Project,取名为JSpleshWindowDemo,其他设置按默认值。
2.新建一个Application,取名为JSpleshWindowDemo,主窗口取名为MainFrame,主窗口标题取名为JSpleshWindowDemo。
3.先来编写信息窗口的代码。新建一个新类SpleshWindow.java,继承java.swing.JWindow类。在SpleshWindow类中,定义新的属性,代码如下:
privateStringstatusStr=null;//信息窗口中要显示的信息 privateImagelogoImg=null;//信息窗口中的显示图片
4.向构造方法中添加代码,加载图片并初始化窗体,实现代码如下:
publicSpleshWindow(JFrameowner){//以JFrame对象为参数,可以是信息窗口和主窗口交互 super(owner); //加载图片 logoImg=getToolkit().getImage(ClassLoader.getSystemResource("images/splesh.jpg")); //等待图片加载完成 java.awt.MediaTrackertracker=newjava.awt.MediaTracker(this);//创建一个MediaTracker对象 tracker.addImage(logoImg,0);//将图片放入MediaTracker对象中,序号为0 try{//等待直到图片加载完成 tracker.waitForAll(); }catch(InterruptedExceptione){ e.printStackTrace(); } //设置信息窗体在屏幕上的显示位置 setLocation(getToolkit().getScreenSize().width/2-logoImg.getWidth(this)/2,getToolkit().getScreenSize().height/2- logoImg.getHeight(this)/2); setSize(logoImg.getWidth(this),logoImg.getHeight(this));//设置窗口大小 }
5.编写设置显示信息的方法,代码如下:
publicvoidsetStatus(Stringstatus){ statusStr=status; paint(getGraphics());//重画窗口来更新信息窗口中的显示信息 }
6.重置paint()方法来绘制图片和显示信息的方法,代码如下:
publicvoidpaint(Graphicsg){ /**@todoOverridethisjava.awt.Componentmethod*/ super.paint(g); //绘制图片 if(logoImg!=null) g.drawImage(logoImg,0,0,this); //绘制显示信息 if(statusStr!=null){ g.setColor(Color.red); g.drawString(statusStr,240,getSize().height-250); } }
7.编写MainFrame类,实现java.lang.Runnable接口,并定义新的属性,设置如下:
privateSpleshWindowspleshWindow=null;
8.向MainFrame类的初始化方法中,添加运行信息窗口的代码,实现代码如下:
privatevoidjbInit()throwsException{ //setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[YourIcon]"))); contentPane=(JPanel)this.getContentPane(); contentPane.setLayout(borderLayout1); this.setSize(newDimension(400,300)); this.setTitle("JSpleshWindowDemo"); //创建新的线程,运行信息窗口 Threadt=newThread(this); t.start(); //等待信息窗口显示 try{ t.join(); }catch(InterruptedExceptione){ e.printStackTrace(); } //向信息窗体中显示消息 longx=System.currentTimeMillis(); while(System.currentTimeMillis()-x<35000) { System.out.print("Waiting"+(35000-System.currentTimeMillis()+x+"\r")); //youcansetstatusstringinsplashwindow spleshWindow.setStatus("Waiting"+(35-(long)(System.currentTimeMillis()/1000)+(long)(x/1000))); } //关闭信息窗体 if(spleshWindow!=null){ spleshWindow.dispose(); spleshWindow=null; } }
9.编写MainFrame类的run()方法,如下所示:
publicvoidrun(){ //新建一个信息窗体并显示 spleshWindow=newSpleshWindow(this); spleshWindow.show(); //thrownewjava.lang.UnsupportedOperationException("Methodrun()notyetimplemented."); }