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



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

一、顯示啓動界面 

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




1 Flash8的啓動界面

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


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

public class TestSplash
{
    
public static void main(String args[])
    {
        
try
        {
            
// 爲了讓啓動界面多顯示3秒,
// 如果是正常的程序,這裏應該時初始化代碼
            Thread.sleep(3000);  
            JFrame frame 
= new JFrame("java SE 6 啓動界面演示");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JLabel label 
= new JLabel("我的標籤", 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

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

3 splash.gif

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

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

Manifest-Version: 1.0

Main-Class: TestSplash

SplashScreen-Image: splash.gif

然後通過以下命令進行打包

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

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

java -jar Splash.jar

現在我們已經可以顯示一個啓動界面了,但這只是一幅靜態的圖,而在大多數時還需要在這幅圖上顯示一些信息,如正在初始化什麼。在java SE 6也提供了可以操作這幅圖的功能。下面的代碼演示瞭如何操作啓動界面。

import javax.swing.*;
import java.awt.*;
public class TestSplash
{
    
public static void main(String args[])
    {
        
try
        {
            String[] info 
= new String[]
            { 
"正在初始化API""正在初始化網絡""正在初始化數據庫" };
            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("我的標籤", JLabel.CENTER);
            frame.add(label, BorderLayout.CENTER);
            frame.setSize(
30095);
            frame.setVisible(
true);
        }
        
catch (Exception e)
        {
        }
    }
}

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



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

另外需要提一點,在SplashScreen類中有一個close方法用於關閉啓動界面,但這個方法一般不需要調用,因爲在主窗口顯示時這個方法自動被調用。當然,要想在初始化過程中關閉這啓動界面,如發生初始化錯誤後,就不能再往下初始化了,因此,就要關閉這個界面,然後或退出程序,或直接進入主界面。

二、系統托盤

現在有很多程序除了提供了一個完整的主界面外,在它最小化或者啓動後在右下角的系統托盤區總是有一個小圖標,如金山詞霸、QQMSN等。圖5顯示了一臺計算機的系統托盤裏的圖標。



5 系統托盤

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


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

public class MyTray
{
    
public static void main(String args[])
    {
// 判斷當前操作系統是否支持系統托盤
       
// 最好加上這個判斷,否則這個程序可能在其它操作系統上無法正常工作
        if (SystemTray.isSupported())          
{
            
// 通過靜態方法getSystemTray()得到系統托盤
            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(
"無法使用系統托盤!");
        }
    }
}


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



6 運行結果

如果多次調用tray.add(trayIcon),可以在一個程序中向系統托盤添加多個圖標。但要注意,圖象可以使用一個Image對象,但彈出菜單要爲每一個圖標建一個,如果不建,就設爲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 信息提示

交互對話框

 

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

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),那麼輸入對話框將消失。

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



 11

圖象轉換

 

java在圖象處理上是比較強大的,但是以前的java SE版本對於GIF圖只能讀,不能寫。這並不是因爲技術原因,而是因爲GIF專利的原因。但最近這個專利到期了,因此,在java SE 6中提供了讀寫GIF的功能。下面的代碼演示瞭如何通過java來將其它格式的圖象轉換爲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支持什麼圖象格式,可以使用如下語句進行查看。

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

顯示結果

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

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章