本文实例形式详述了Java实现一个程序运行时的启动窗口效果,如常用的Microsoft Word、 Borland JBuilder 等,这样的窗口称为信息窗口。使用信息窗口的好处是可以使用户在等待软件主界面出现前的一段时间中得知软件运行状态。本例将演示如何来实现信息窗口,当打开程序时,信息窗口先显示,并在窗口上倒计时,直到“waiting 0”时,关闭该窗口,显示程序的主窗口。
该功能的主要实现方法如下:
一般来说,大多数的信息窗口是没有标题栏的,因此信息窗口不能由继承JFrame 类来实现,一种简单的做法是通过继承JWindow 来实现(当然继承Window 类也可以,但一个原则是尽量使用swing 中的界面
类)。另外,本例用到java.awt 包中的MediaTracker 类。使用该类的好处是可以更好地管理程序中要使用的图片,同时还可以保证图片和界面同时显示,避免了窗口显示后很久才显示图片的缺点。
具体操作步骤如下:
1.新建一个Project,取名为JSpleshWindowDemo,其他设置按默认值。
2.新建一个Application ,取名为JSpleshWindowDemo,主窗口取名为MainFrame,主窗口标题取名为JSpleshWindowDemo。
3.先来编写信息窗口的代码。新建一个新类SpleshWindow.java,继承java.swing.JWindow类。在SpleshWindow 类中,定义新的属性,代码如下:
1
2
|
private String statusStr= null ; //信息窗口中要显示的信息
private Image logoImg= null ; //信息窗口中的显示图片
|
4.向构造方法中添加代码,加载图片并初始化窗体,实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public SpleshWindow(JFrame owner) { //以JFrame 对象为参数,可以是信息窗口和主窗口交互
super ( owner );
// 加载图片
logoImg=getToolkit().getImage( ClassLoader.getSystemResource( "images/splesh.jpg" ) );
// 等待图片加载完成
java.awt.MediaTracker tracker= new java.awt.MediaTracker( this ); //创建一个MediaTracker 对象
tracker.addImage( logoImg , 0 ); //将图片放入MediaTracker 对象中,序号为0
try { //等待直到图片加载完成
tracker.waitForAll();
} catch ( InterruptedException e ) {
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.编写设置显示信息的方法,代码如下:
1
2
3
4
|
public void setStatus( String status ){
statusStr=status;
paint( getGraphics() ); // 重画窗口来更新信息窗口中的显示信息
}
|
6.重置paint()方法来绘制图片和显示信息的方法,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
public void paint(Graphics g) {
/**@todo Override this java.awt.Component method*/
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 接口,并定义新的属性,设置如下:
1
|
private SpleshWindow spleshWindow= null ;
|
8.向MainFrame 类的初始化方法中,添加运行信息窗口的代码,实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
private void jbInit() throws Exception {
//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Your Icon]")));
contentPane = (JPanel) this .getContentPane();
contentPane.setLayout(borderLayout1);
this .setSize( new Dimension( 400 , 300 ));
this .setTitle( "JSpleshWindowDemo" );
//创建新的线程,运行信息窗口
Thread t = new Thread( this );
t.start();
// 等待信息窗口显示
try {
t.join();
} catch ( InterruptedException e ){
e.printStackTrace() ;
}
// 向信息窗体中显示消息
long x=System.currentTimeMillis();
while ( System.currentTimeMillis()-x < 35000 )
{
System.out.print( "Waiting " +( 35000 -System.currentTimeMillis()+x+ " \r" ) );
// you can set status string in splash window
spleshWindow.setStatus( "Waiting " +( 35 -( long )(System.currentTimeMillis()/ 1000 )+( long )(x/ 1000 )) );
}
//关闭信息窗体
if ( spleshWindow!= null ) {
spleshWindow.dispose();
spleshWindow= null ;
}
}
|
9.编写MainFrame 类的run()方法,如下所示:
1
2
3
4
5
6
|
public void run() {
//新建一个信息窗体并显示
spleshWindow= new SpleshWindow( this );
spleshWindow.show();
// throw new java.lang.UnsupportedOperationException("Method run() not yet implemented.");
}
|