熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java很神奇 用swing制作歡迎屏幕

2013-11-23 19:26:14  來源: Java核心技術 

  幾乎所有時髦的應用都有一個歡迎屏幕歡迎屏幕既是宣傳產品的方法之一而且在長時間的應用啟動過程中歡迎屏幕還用來表示應用正在准備過程中現在教你怎麼用java中的swing技術制作一個時髦的歡迎屏幕

  下面是一個最簡單的歡迎屏幕實現

  Java代碼

  class SplashWindow extends JWindow

  {

  public SplashWindow(String filename Frame f)

  {

  super(f);

  JLabel l = new JLabel(new ImageIcon(filename));

  getContentPane()add(l BorderLayoutCENTER);

  pack();

  Dimension screenSize =

  ToolkitgetDefaultToolkit()getScreenSize();

  Dimension labelSize = lgetPreferredSize();

  setLocation(screenSizewidth/ (labelSizewidth/)

  screenSizeheight/ (labelSizeheight/));

  setVisible(true);

  screenSize = null;

  labelSize = null;

  }

  }

  SplashWindow類從Swing的JWindow派生JWindow是一個容器它沒有其他窗口所具有的各種窗口元素如標題條窗口管理按鈕甚至連突出顯示的邊框也沒有因此JWindow對於制作歡迎屏幕來說是非常合適的上面的代碼假定圖形文件在當前目錄圖形通過ImageIcon裝入內存然後它就被放到了JWindow的中心接著窗口被pack()這使得Swing把窗口調整到適當的大小最後窗口被移到了屏幕的中心

  如果我們運行上面的程序可以發現雖然歡迎畫面確實出現在屏幕中央但遺憾的它卻不會關閉!要關閉歡迎畫面我們需要加入更多的代碼 Java代碼

  class SplashWindow extends JWindow

  {

  public SplashWindow(String filename Frame f)

  {

  super(f);

  JLabel l = new JLabel(new ImageIcon(filename));

  getContentPane()add(l BorderLayoutCENTER);

  pack();

  Dimension screenSize =

  ToolkitgetDefaultToolkit()getScreenSize();

  Dimension labelSize = lgetPreferredSize();

  setLocation(screenSizewidth/ (labelSizewidth/)

  screenSizeheight/ (labelSizeheight/));

  addMouseListener(new MouseAdapter()

  {

  public void mousePressed(MouseEvent e)

  {

  setVisible(false);

  dispose();

  }

  });

  setVisible(true);

  }

  }

  和原先的SplashWindow類相比這個SplashWindow類唯一的區別在於多出了一個安裝到JWindow上的匿名MouseListener經過這個改動之後用戶可以點擊歡迎屏幕關閉它

  現在我們有了一個很不錯的歡迎屏幕它可以通過點擊的方法關閉但它不會自己消失接下來我們要加入代碼使得歡迎屏幕在顯示一定的時間之後自動消失這裡我們要考慮到運用線程

  Java代碼

  class SplashWindow extends JWindow

  {

  public SplashWindow(String filename Frame f int waitTime)

  {

  super(f);

  JLabel l = new JLabel(new ImageIcon(filename));

  getContentPane()add(l BorderLayoutCENTER);

  pack();

  Dimension screenSize =

  ToolkitgetDefaultToolkit()getScreenSize();

  Dimension labelSize = lgetPreferredSize();

  setLocation(screenSizewidth/ (labelSizewidth/)

  screenSizeheight/ (labelSizeheight/));

  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

  {

  Threadsleep(pause);

  SwingUtilitiesinvokeAndWait(closerRunner);

  }

  catch(Exception e)

  {

  eprintStackTrace();

  // 能夠捕獲InvocationTargetException

  // 能夠捕獲InterruptedException

  }

  }

  };

  setVisible(true);

  Thread splashThread = new Thread(waitRunner SplashThread);

  splashThreadstart();

  }

  }

  這裡的基本思路是利用一個在一定時間內暫停等待的Thread對象在上面的代碼中線程的暫停時間是當這個線程喚醒時它將關閉歡迎屏幕由於Swing是非線程安全的除非代碼在事件分派線程上執行否則它就不應該影響任何UI組件的狀態所謂事件分派線程就是Swing中負責繪圖和事件處理的線程

  為了解決這個問題Swing設計者賦予我們安全地把Runnable對象加入UI事件隊列的能力在本例中我們用可運行對象closerRunner完成最關鍵的工作我們把可運行對象傳入SwingUtilitiesinvokeAndWait()靜態方法然後wingUtilitiesinvokeAndWait()進行所有未完成的UI操作並執行傳遞給該方法的可運行對象closerRunner的run方法通過運用一個獨立的線程負責歡迎屏幕的關閉操作應用擔負起了顯示和關閉歡迎屏幕之間的所有操作

  如果要讓歡迎屏幕總是顯示且用戶不能關閉它你必須刪除那些隱藏歡迎屏幕的代碼如果要讓歡迎屏幕只能由用戶手工關閉你可以象使用任何其他JWindow對象一樣調用SplashWindow對象上的setVisible(false)和dispose()方法

  總而言之借助於SwingUtilitiesinvokeAndWait()方法我們可以安全地創建出多線程歡迎屏幕具體實現時歡迎屏幕可以由用戶點擊關閉也可以在一定的時間之後自動關閉Swing所支持的線程模型使得應用在顯示歡迎屏幕之後仍能夠響應其他事件和處理其他任務


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26872.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.