本文實例形式詳述了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."); } |