隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數(shù)據(jù)加載中……

          Java SE 6之GUI:讓界面更加絢麗(上)

          本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

          本文曾發(fā)表于天極網(wǎng):http://dev.yesky.com/185/2690685.shtml

          Java SE 6之GUI:讓界面更加絢麗(下)

          Java是一種非常強(qiáng)大的編程語言,但JavaGUI能力一直是它的軟肋。雖然Java提供2種圖形解決方案,AWTSwing。但這2種圖形庫的功能十分有限,使用它們并不能帶來更多的用戶體驗。而且AWTSwing的更新速度很慢。一直到Java SE 5也沒什么明顯的變化。幸好Java SE 6終于為它們增加大更強(qiáng)大的功能。有了這些功能,使用AWTSwing設(shè)計的用戶界面可以更貼近用戶。為了使讀者能夠更早地體驗Java SE 6 GUI的美麗,本文就Java SE 6 GUI提供的主要功能進(jìn)行討論。

          一、顯示啟動界面 

          現(xiàn)在很多商業(yè)和非商業(yè)軟件在啟動時都必須初始化,有時初始化的時間會很長,如photoshopflash等,為了讓用戶有耐心繼續(xù)等待,不要誤以為死器了,這些軟件在初始化之前總是顯示一個圖形界面來告訴用戶軟件正在做什么。如圖1Flash8在啟動時的初始化界面。




          1 Flash8的啟動界面

          當(dāng)我們在設(shè)計軟件時可能也需要這樣一個界面。當(dāng)然,這在Java SE的早期版本中也可以做到,但比較費勁,基本的實現(xiàn)是將一個圖形放到窗體上,然后先顯示這個,這需要編寫一定的代碼,而Java SE 6提供了一個更簡單的方法,可以不添加一行代碼,而且在界面要改變時還不需要重新編譯源程序。讓我們先看一個簡單的例子。


          import javax.swing.*;
          import java.awt.*;

          public class TestSplash
          {
              
          public static void main(String args[])
              {
                  
          try
                  {
                      
          // 為了讓啟動界面多顯示3秒,
          // 如果是正常的程序,這里應(yīng)該時初始化代碼
                      Thread.sleep(3000);  
                      JFrame frame 
          = new JFrame("Java SE 6 啟動界面演示");
                      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      JLabel label 
          = new JLabel("我的標(biāo)簽", JLabel.CENTER);
                      frame.add(label, BorderLayout.CENTER);
                      frame.setSize(
          30095);
                      frame.setVisible(
          true);
                  }
                  
          catch (InterruptedException e)
                  {
                  }

              }
          }

          上面的程序是一個非常簡單的界面演示程序,它的界面如圖2所示。



          2

          如果使用java TestSplash直接運行上面的程序,將立刻顯示如圖2的界面。Java SE 6java命令上提供了一個選項,可以在顯示程序主界面之前先顯示一幅圖。

          java –splash:splash.gif TestSplash

          如果運行以上的命令,在出現(xiàn)圖2所示的界面之前會先顯示splash.gif,然后再過幾秒鐘splash.gif自動關(guān)閉,然后會顯示主界面。在上面程序中的Thread.sleep(3000); 是為了使splash.gif顯示的時間長一些,可以將這句改為直正的初始化代碼。splash.gif文件如圖3所示。

          3 splash.gif

          在發(fā)布時一般將程序所用到的.class文件打包成一個或幾個.jar文件,如果是這樣,可以將splash.gif一同打包在.jar文件中。然后在manifest.mf文件中使用SplashScreen-Image指定啟動界面圖象。

          在打包之前,先建一個文本文件manifest.mf,內(nèi)容如下

          Manifest-Version: 1.0

          Main-Class: TestSplash

          SplashScreen-Image: splash.gif

          然后通過以下命令進(jìn)行打包

          jar -mcvf manifest.mf Splash.jar TestSplash.class splash.gif

          然后通過如下命令運行程序

          java -jar Splash.jar

          現(xiàn)在我們已經(jīng)可以顯示一個啟動界面了,但這只是一幅靜態(tài)的圖,而在大多數(shù)時還需要在這幅圖上顯示一些信息,如正在初始化什么。在Java SE 6也提供了可以操作這幅圖的功能。下面的代碼演示了如何操作啟動界面。

          import javax.swing.*;
          import java.awt.*;
          public class TestSplash
          {
              
          public static void main(String args[])
              {
                  
          try
                  {
                      String[] info 
          = new String[]
                      { 
          "正在初始化API""正在初始化網(wǎng)絡(luò)""正在初始化數(shù)據(jù)庫" };
                      SplashScreen splash 
          = SplashScreen.getSplashScreen();
                      Graphics g 
          = splash.createGraphics();
                      
          if (splash != null)
                      {
                          
          for (int i = 0; i < 3; i++)
                          {
                              g.setColor(Color.BLACK);
                              g.drawString(info[i], 
          350170 + i * 15);
                              splash.update();
                              Thread.sleep((i 
          + 1)*1000);
                          }
                      }
                      JFrame frame 
          = new JFrame("Java SE 6 啟動界面演示");
                      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      JLabel label 
          = new JLabel("我的標(biāo)簽", JLabel.CENTER);
                      frame.add(label, BorderLayout.CENTER);
                      frame.setSize(
          30095);
                      frame.setVisible(
          true);
                  }
                  
          catch (Exception e)
                  {
                  }
              }
          }

          上面的代碼SplashSreen獲得啟動界面,然后再通過createGraphics得到一個圖形句柄。本例將在啟動界面顯示按一定時間間隔顯示三個字符串,這三個字符串保存在info數(shù)組中。啟動界面如圖4所示。



          4 在啟動界面上顯示三個字符串

          另外需要提一點,在SplashScreen類中有一個close方法用于關(guān)閉啟動界面,但這個方法一般不需要調(diào)用,因為在主窗口顯示時這個方法自動被調(diào)用。當(dāng)然,要想在初始化過程中關(guān)閉這啟動界面,如發(fā)生初始化錯誤后,就不能再往下初始化了,因此,就要關(guān)閉這個界面,然后或退出程序,或直接進(jìn)入主界面。

          二、系統(tǒng)托盤

          現(xiàn)在有很多程序除了提供了一個完整的主界面外,在它最小化或者啟動后在右下角的系統(tǒng)托盤區(qū)總是有一個小圖標(biāo),如金山詞霸、QQMSN等。圖5顯示了一臺計算機(jī)的系統(tǒng)托盤里的圖標(biāo)。



          5 系統(tǒng)托盤

          如果使用C++Delphi(Pascal)等語言實現(xiàn)這個功能非常簡單,只要調(diào)用一下系統(tǒng)API即可,但在以前版本(Java SE 5以前)的Java SESun并未提供訪問系統(tǒng)托盤的類,在那時使用Java訪問系統(tǒng)托盤的唯一方法就是使用JNI直接調(diào)用系統(tǒng)API,但這種方法實現(xiàn)比較復(fù)雜,而且如果這樣做,就破壞了Java的跨平臺特性(除非你為每一個操作系統(tǒng)平臺都做一個這樣的類)。Java的這個缺陷緩和終于在Java SE 6中得到彌補。在java.awt包中提供了一個SystemTray類可以直接訪問系統(tǒng)托盤。下面的代碼演示了一個簡單的實現(xiàn)。


          import javax.swing.*;
          import java.awt.*;

          public class MyTray
          {
              
          public static void main(String args[])
              {
          // 判斷當(dāng)前操作系統(tǒng)是否支持系統(tǒng)托盤
                 
          // 最好加上這個判斷,否則這個程序可能在其它操作系統(tǒng)上無法正常工作
                  if (SystemTray.isSupported())          
          {
                      
          // 通過靜態(tài)方法getSystemTray()得到系統(tǒng)托盤
                      SystemTray tray = SystemTray.getSystemTray();
                      
          // 裝載托盤圖象 
                      Image image = Toolkit.getDefaultToolkit().getImage(
                                      
          "tray.gif");
                      
          // 為這個托盤加一個彈出菜單
                      PopupMenu popup = new PopupMenu();
                      MenuItem item 
          = new MenuItem("我的菜單");
                      popup.add(item);
                      
          // 為這個托盤加一個提示信息
                      TrayIcon trayIcon = new TrayIcon(image, "提示信息", popup);
                      
          try
                      {
                          tray.add(trayIcon);
                      }
                      
          catch (AWTException e)
                      {
                          System.err.println(
          "無法向這個托盤添加新項: " + e);
                      }
                  }
                  
          else
                  {
                      System.err.println(
          "無法使用系統(tǒng)托盤!");
                  }
              }
          }


          在運行上面的程序之前,tray.gif一定要放到當(dāng)前目錄,如果放到其它的目錄,要在程序中指明。圖6是程序運行結(jié)果。最左側(cè)的五彩光盤圖標(biāo)就是本程序加入了。



          6 運行結(jié)果

          如果多次調(diào)用tray.add(trayIcon),可以在一個程序中向系統(tǒng)托盤添加多個圖標(biāo)。但要注意,圖象可以使用一個Image對象,但彈出菜單要為每一個圖標(biāo)建一個,如果不建,就設(shè)為null。如:

                 TrayIcon trayIcon1 = new TrayIcon(image, "提示信息1", null);

                 TrayIcon trayIcon2 = new TrayIcon(image, "提示信息2", null);

                 TrayIcon trayIcon3 = new TrayIcon(image, "提示信息3", null);

          tray.add(trayIcon1);

          tray.add(trayIcon2);

          tray.add(trayIcon3);

          7為顯示界面圖



          7

          Java SE 6還為我們提供了3種提示信息,它們是警告、錯誤和信息。如使用如下語句添加提示信息。

          添加警告提示

          trayIcon.displayMessage("警告", "這是一個警告提示!", TrayIcon.MessageType.WARNING);



          8 警告提示

          添加錯誤提示

          trayIcon.displayMessage("錯誤", "這是一個錯誤提示!", TrayIcon.MessageType.ERROR);




          9 錯誤提示

          添加信息提示

          trayIcon.displayMessage("信息", "這是一個信息提示!", TrayIcon.MessageType.INFO);



          10 信息提示

          交互對話框

           

          在一般的程序語言或開發(fā)工具中都有一些標(biāo)準(zhǔn)的對話框以方便和用戶交互,如Delphi中有InputBox對話框用來采集用戶的輸入信息。在Java SE 6中也提供了類似的標(biāo)準(zhǔn)對話框來滿足這些需求。

          Java SE 6中提供了一種輸入對話框,下面是一個使用這個對話框的簡單例子。

          JOptionPane pane = new JOptionPane("文本",                  JOptionPane.INFORMATION_MESSAGE);

                 pane.setWantsInput(true);    

                 JDialog dialog = pane.createDialog(parent, "請輸入文本");

                 dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);

                 dialog.setVisible(true);

                 String msg = pane.getInputValue();

          上面的代碼使用JoptionPane對象的createDialog方法來建立一個輸入對話框。上面的代碼有幾點需要注意一下。

          1.                   如果將pane.setWantsInput(true)改為pane.setWantsInput(false),那么輸入對話框?qū)⑾А?/span>

          2.                   這個對話框使用的是APPLICATION_MODAL模式,Java SE 6還提供了一個DOCUMENT_MODAL模式,這兩種模式最大的區(qū)別是第一種模式是對整個應(yīng)用程序的,也就是說,使用這種模式彈出對話框后,整個程序都不訪問,而使用第二種模式,只有彈出對話框的窗體不可訪問,其它的窗體并不受影響。圖11為以上代碼的程序界面。



           11

          圖象轉(zhuǎn)換

           

          Java在圖象處理上是比較強(qiáng)大的,但是以前的Java SE版本對于GIF圖只能讀,不能寫。這并不是因為技術(shù)原因,而是因為GIF專利的原因。但最近這個專利到期了,因此,在Java SE 6中提供了讀寫GIF的功能。下面的代碼演示了如何通過Java來將其它格式的圖象轉(zhuǎn)換為gif格式。


          import javax.imageio.*;
          import java.io.*;
          import java.awt.image.*;
          import java.util.*;

          public class ToGIF
          {
              
          public static void main(String args[]) throws IOException
              {
                  
          // 可以將abc.bmp換成其它格式的圖象
                  File inputFile = new File(“abc.bmp”);
                  BufferedImage input 
          = ImageIO.read(inputFile);
                  File outputFile 
          = new File("abc.gif");
                  ImageIO.write(input, 
          "GIF", outputFile);
              }
          }

          如果你想知道在Java SE 6支持什么圖象格式,可以使用如下語句進(jìn)行查看。

          System.out.println(Arrays.toString(ImageIO.getWriterFormatNames()));

          顯示結(jié)果

          [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]





          Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2008-04-29 14:34 銀河使者 閱讀(8059) 評論(10)  編輯  收藏 所屬分類: java 原創(chuàng)

          評論

          # re: Java SE 6之GUI:讓界面更加絢麗(上)[未登錄]  回復(fù)  更多評論   

          不錯
          2008-04-29 14:41 | 海邊沫沫

          # re: Java SE 6之GUI:讓界面更加絢麗(上)  回復(fù)  更多評論   

          博主厲害啊!值得學(xué)習(xí)學(xué)習(xí)!
          2008-04-29 15:34 | 日月雨林@gmail.com

          # re: Java SE 6之GUI:讓界面更加絢麗(上)  回復(fù)  更多評論   

          不錯不錯。我一直對于Swing 的 Java Application很感興趣,希望多多交流
          2008-04-29 16:20 | YODA

          # re: Java SE 6之GUI:讓界面更加絢麗(上)  回復(fù)  更多評論   

          現(xiàn)在最新版的NetBeans6.1對Java GUI支持的很好,大家可以去下載試試。非常不錯。現(xiàn)在我感覺NetBeans在開發(fā)Java GUI、J2ME和ROR上是非常不錯的。如果開發(fā)這三類程序,NetBeans是首選
          2008-04-29 16:38 | 銀河使者

          # re: Java SE 6之GUI:讓界面更加絢麗(上)  回復(fù)  更多評論   

          不錯,近來大家又開始關(guān)心GUI了, 希望能把討厭的web開發(fā)干掉,呵呵!
          2008-04-29 22:12 | hammer

          # re: Java SE 6之GUI:讓界面更加絢麗(上)[未登錄]  回復(fù)  更多評論   

          也有人做過swing GUI的框架,www.soyframework.com
          2008-04-29 22:28 | origo

          # re: Java SE 6之GUI:讓界面更加絢麗(上)  回復(fù)  更多評論   

          不錯,我還是喜歡swing。
          2008-04-30 00:13 | pinuo

          # re: Java SE 6之GUI:讓界面更加絢麗(上)  回復(fù)  更多評論   

          xihuan
          2008-05-02 22:15 | yuhan

          # re: Java SE 6之GUI:讓界面更加絢麗(上)  回復(fù)  更多評論   

          不錯哦。收藏了
          2008-05-03 23:36 | Liceven

          # re: Java SE 6之GUI:讓界面更加絢麗(上)  回復(fù)  更多評論   

          驚嘆,能做成這樣子非常強(qiáng)大,http://www.80115.com開源社區(qū)
          2008-05-26 13:12 | 溺水小魚
          主站蜘蛛池模板: 浙江省| 东乡族自治县| 涞水县| 阳曲县| 平果县| 南溪县| 宁乡县| 远安县| 新绛县| 洪洞县| 沧州市| 高台县| 惠东县| 黔西| 进贤县| 秦安县| 桦南县| 云龙县| 措美县| 姚安县| 永清县| 策勒县| 喀什市| 渝北区| 剑川县| 洞口县| 宜阳县| 包头市| 潜江市| 太仓市| 天长市| 乐平市| 兰溪市| 巫山县| 开原市| 湟源县| 大余县| 东宁县| 江北区| 龙里县| 武川县|