轉(zhuǎn)帖|其它|編輯:郝浩|2010-07-23 09:31:33.000|閱讀 780 次
概述:幾乎所有時(shí)髦的應(yīng)用都有一個(gè)歡迎屏幕。歡迎屏幕既是宣傳產(chǎn)品的方法之一,而且在長(zhǎng)時(shí)間的應(yīng)用啟動(dòng)過(guò)程中,歡迎屏幕還用來(lái)表示應(yīng)用正在準(zhǔn)備過(guò)程中。現(xiàn)在教你怎么用java中的swing技術(shù)制作一個(gè)時(shí)髦的歡迎屏幕.
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
幾乎所有時(shí)髦的應(yīng)用都有一個(gè)歡迎屏幕。歡迎屏幕既是宣傳產(chǎn)品的方法之一,而且在長(zhǎng)時(shí)間的應(yīng)用啟動(dòng)過(guò)程中,歡迎屏幕還用來(lái)表示應(yīng)用正在準(zhǔn)備過(guò)程中?,F(xiàn)在教你怎么用java中的swing技術(shù)制作一個(gè)時(shí)髦的歡迎屏幕.
下面是一個(gè)最簡(jiǎn)單的歡迎屏幕實(shí)現(xiàn):
Java代碼
class SplashWindow1 extends JWindow
{
public SplashWindow1(String filename, Frame f)
{
super(f);
JLabel l = new JLabel(new ImageIcon(filename));
getContentPane().add(l, BorderLayout.CENTER);
pack();
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
Dimension labelSize = l.getPreferredSize();
setLocation(screenSize.width/2 - (labelSize.width/2),
screenSize.height/2 - (labelSize.height/2));
setVisible(true);
screenSize = null;
labelSize = null;
}
}
SplashWindow1類(lèi)從Swing的JWindow派生。JWindow是一個(gè)容器,它沒(méi)有其他窗口所具有的各種窗口元素,如標(biāo)題條、窗口管理按鈕,甚至連突出顯示的邊框也沒(méi)有。因此,JWindow對(duì)于制作歡迎屏幕來(lái)說(shuō)是非常合適的。上面的代碼假定圖形文件在當(dāng)前目錄。圖形通過(guò)ImageIcon裝入內(nèi)存,然后它就被放到了JWindow的中心。接著,窗口被pack(),這使得Swing把窗口調(diào)整到適當(dāng)?shù)拇笮?,最后窗口被移到了屏幕的中心?/p>
如果我們運(yùn)行上面的程序,可以發(fā)現(xiàn)雖然歡迎畫(huà)面確實(shí)出現(xiàn)在屏幕中央,但遺憾的,它卻不會(huì)關(guān)閉!要關(guān)閉歡迎畫(huà)面,我們需要加入更多的代碼: Java代碼
class SplashWindow2 extends JWindow
{
public SplashWindow2(String filename, Frame f)
{
super(f);
JLabel l = new JLabel(new ImageIcon(filename));
getContentPane().add(l, BorderLayout.CENTER);
pack();
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
Dimension labelSize = l.getPreferredSize();
setLocation(screenSize.width/2 - (labelSize.width/2),
screenSize.height/2 - (labelSize.height/2));
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
setVisible(false);
dispose();
}
});
setVisible(true);
}
}
和原先的SplashWindow1類(lèi)相比,這個(gè)SplashWindow2類(lèi)唯一的區(qū)別在于多出了一個(gè)安裝到JWindow上的匿名MouseListener。經(jīng)過(guò)這個(gè)改動(dòng)之后,用戶(hù)可以點(diǎn)擊歡迎屏幕關(guān)閉它。
現(xiàn)在我們有了一個(gè)很不錯(cuò)的歡迎屏幕,它可以通過(guò)點(diǎn)擊的方法關(guān)閉,但它不會(huì)自己消失。接下來(lái)我們要加入代碼,使得歡迎屏幕在顯示一定的時(shí)間之后自動(dòng)消失。這里我們要考慮到運(yùn)用線程。
Java代碼
class SplashWindow3 extends JWindow
{
public SplashWindow3(String filename, Frame f, int waitTime)
{
super(f);
JLabel l = new JLabel(new ImageIcon(filename));
getContentPane().add(l, BorderLayout.CENTER);
pack();
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
Dimension labelSize = l.getPreferredSize();
setLocation(screenSize.width/2 - (labelSize.width/2),
screenSize.height/2 - (labelSize.height/2));
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
setVisible(false);
dispose();
}
});
final int pause = waitTime;
final Runnable closerRunner = new Runnable()
{
public void run()
{
setVisible(false);
dispose();
}
};
Runnable waitRunner = new Runnable()
{
public void run()
{
try
{
Thread.sleep(pause);
SwingUtilities.invokeAndWait(closerRunner);
}
catch(Exception e)
{
e.printStackTrace();
// 能夠捕獲InvocationTargetException
// 能夠捕獲InterruptedException
}
}
};
setVisible(true);
Thread splashThread = new Thread(waitRunner, "SplashThread");
splashThread.start();
}
}
這里的基本思路是利用一個(gè)在一定時(shí)間內(nèi)暫停等待的Thread對(duì)象。在上面的代碼中,線程的暫停時(shí)間是4秒。當(dāng)這個(gè)線程喚醒時(shí),它將關(guān)閉歡迎屏幕。由于Swing是非線程安全的,除非代碼在事件分派線程上執(zhí)行,否則它就不應(yīng)該影響任何UI組件的狀態(tài)。所謂事件分派線程,就是Swing中負(fù)責(zé)繪圖和事件處理的線程。
為了解決這個(gè)問(wèn)題,Swing設(shè)計(jì)者賦予我們安全地把Runnable對(duì)象加入U(xiǎn)I事件隊(duì)列的能力。在本例中,我們用可運(yùn)行對(duì)象closerRunner完成最關(guān)鍵的工作。我們把可運(yùn)行對(duì)象傳入SwingUtilities.invokeAndWait()靜態(tài)方法,然后wingUtilities.invokeAndWait()進(jìn)行所有未完成的UI操作,并執(zhí)行傳遞給該方法的可運(yùn)行對(duì)象closerRunner的run方法。通過(guò)運(yùn)用一個(gè)獨(dú)立的線程負(fù)責(zé)歡迎屏幕的關(guān)閉操作,應(yīng)用擔(dān)負(fù)起了顯示和關(guān)閉歡迎屏幕之間的所有操作。
如果要讓歡迎屏幕總是顯示且用戶(hù)不能關(guān)閉它,你必須刪除那些隱藏歡迎屏幕的代碼。如果要讓歡迎屏幕只能由用戶(hù)手工關(guān)閉,你可以象使用任何其他JWindow對(duì)象一樣調(diào)用SplashWindow3對(duì)象上的setVisible(false)和dispose()方法。
總而言之,借助于SwingUtilities.invokeAndWait()方法,我們可以安全地創(chuàng)建出多線程歡迎屏幕。具體實(shí)現(xiàn)時(shí),歡迎屏幕可以由用戶(hù)點(diǎn)擊關(guān)閉,也可以在一定的時(shí)間之后自動(dòng)關(guān)閉。Swing所支持的線程模型使得應(yīng)用在顯示歡迎屏幕之后仍能夠響應(yīng)其他事件和處理其他任務(wù)。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載