本文實例形式詳述了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 類別中,定義新的屬性,程式碼如下:
private String statusStr=null; //訊息視窗中要顯示的資訊private Image logoImg=null; //訊息視窗中的顯示圖片
4.在構造方法中加入程式碼,載入圖片並初始化窗體,實作程式碼如下:
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 物件中,序號為0try{ //等待直到圖片載入完成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.寫出設定顯示資訊的方法,程式碼如下:
public void setStatus( String status ){statusStr=status;paint( getGraphics() ); // 重畫視窗來更新資訊視窗中的顯示資訊}6.重置paint()方法來繪製圖片和顯示資訊的方法,程式碼如下:
public void paint(Graphics g) {/**@todo Override this java.awt.Component method*/super.paint(g);//繪製圖片if ( logoImg!=null )g.drawImage( logoImg , 0 , 00 , this );//繪製顯示資訊if ( statusStr!=null ){g.setColor(Color.red);g.drawString( statusStr , 240 , getSize().height-250 );}}7.編寫MainFrame 類,實作java.lang.Runnable 接口,並定義新的屬性,設定如下:
private SpleshWindow spleshWindow=null;
8.在MainFrame 類別的初始化方法中,加入運行資訊視窗的程式碼,實作程式碼如下:
private void jbInit() throws Exception {//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Your Icon]")));contentPane = (JPanel) this.getp. (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 windowspleshWindow.setStatus( "Waiting "+(35-(long)(System.currentTimeMillis()/1000)+(long)(x/1000)) );}//關閉訊息窗體if ( spleshWindow!=null ) {spleshWindow.dispose(); spleshWindow=null;}}9.寫出MainFrame 類別的run()方法,如下所示:
public void run() {//新建一個訊息窗體並顯示spleshWindow=new SpleshWindow( this );spleshWindow.show();// throw new java.lang.UnsupportedOperationException("Method run() not yet implemented.") ;}