作者(枯木)
“從Java誕生至今已有9年時間,而從第二代Java平臺J2SE算起也有5個年頭了。在這樣的背景下,將下一個版本的版本號從1.5改為5.0可以更好的反映出新版J2SE的成熟度、穩定性、可伸縮性和安全性?!?/SPAN> Sun公司如是解釋Java的這次意義深遠的變革。眾所周知Sun公司從發布Java以來,對Java的每一次變更可謂是小心翼翼,特別是經歷了版本一到版本二的變更后,Java一直就停留在比較穩定的時期,這對于一個處于IT行業前沿中的主流技術確實令人難以想象。
可能對于象Sun這種以技術起家的公司來說,從骨子里就透出一種“不鳴則已,一鳴驚人”的氣質。Java從版本一到二的飛躍中已經初露端倪,那么這次Java的變更又會帶來什么呢?從它發布3個月以來的各方評價,亦可探知一二。其他暫且不論,單從這次變更涉及的面上看就知,這絕非產于一朝一夕,從宏觀上語言特性到具體的API,從Java底層的虛擬機到高層的核心庫,幾乎無一例外的加入了這次變更。如此之大的變更,即便是我這個對Java語言認識不深的人,也能從中略窺一二,但不敢深論,只是學有小得,順道寫些想法,與各位共同學習交流。以下我將對J2SE(TM) 5.0中的用戶接口(UI)部分做一些簡要的介紹。
Java一直以來在桌面系統中表現的并不是很成功,究其原因主要是在UI方面表現的不盡如人意,雖然在理論上Sun公司對UI同樣做出了無所不能的承諾,可是一個真正成功的設計不能只停留在理論層面上,而要真正受開發人員認可,在市場中得到青睞才能算得上成功,可Java在UI方面兩者都做的不是很優秀。這次J2SE(TM) 5.0在UI方面作了大幅度的調整,大有彌補這方面缺陷的勢頭,對于搶奪在桌面系統的領地是志在必得。關于這次調整的相關評論信息,可以在網上查閱,這里限于篇幅暫且不論。下面將對J2SE(TM) 5.0涉及UI方面的調整做一些介紹,其內容包括:
1、國際化
2、Java 聲音技術
3、Java 2D(TM)技術
4、圖像 I/O
5、AWT
6、Swing
上面的各個主題由于本人水平及篇幅所限可能無法一一詳述,有些在這里只能稍作介紹,作為一個引子,其余的還望讀者更多地去思考,去探索。
Java語言作為第一種支持國際化的語言,在Internet從一開始就具有其他語言無與倫比的國際化的本質特性:用Unicode來編寫所有的字符串??墒抢碚撆c實際總是不能完全謀和的,因為Unicode本身也在不斷變化。
在J2SE(TM) 5.0中,主要的變化是對java.lang, java.text, java.util.regex等包進行調整,使整個字符處理基于Unicode4.0的標準之上,同時加強了對增補字符的支持(欲了解更多信息請參照:《Supplementary Characters in the Java Platform》By Norbert Lindenberg and Masayoshi Okutsu,)。另外這些調整,已經比較全面地解決了越南等東南亞國家的文字讀寫及顯示問題,雖然并沒有經過大范圍的測試。查看Java所支持的語言及相應的版本信息可以采用以下代碼進行查詢。
import java.util.*;
import java.text.*;
public class Test{
public static void main(String[] args) {
//輸出JVM支持的語言
Locale locale[] = DateFormat.getAvailableLocales();
System.out.println("======本地系統支持語言:======== ");
for (int i = 0; i < locale.length; i++) {
System.out.println(locale[i].toString() + "\t" + locale[i].getDisplayName());
}
//輸出 JVM 默認屬性
System.out.println("======系統屬性======== ");
System.getProperties().list(System.out);
}
}
在桌面系統中,J2SE(TM) 5.0的這次變更主要表現在成功地處理了邏輯字體的多語言文本支持,例如,如果您在泰國語環境中,但已經安裝了韓國語的字體,就可以呈現泰國語和韓國語,這只需通過java.util.Locale類進行相應的操作即可方便地達到應有的目標。還同時解決了在 Windows 2000/XP 中,AWT調用 Unicode API的問題。這樣在J2SE(TM) 5.0中就可以運用它自帶的一些文本組件進行文本處理,而不用受到 Windows locale 設置的限制,增強了Java跨平臺的功能,使Java真正能夠相對地獨立于Windows平臺。例如,AWT 文本組件可以在梵文書寫系統中接受和顯示文本,并不用關心 Windows locale 的設置,而僅僅依靠Java程序內部的處理機制。
另外,在java.nio包中也增強了對I/O傳輸國際化的支持。這在核心庫中已經有所介紹了,這里就不在重復了。
聲音技術在Java的領域里應該算是一個比較專業,對于很多非專業的開發者可能會很陌生,讀者如果希望對這方面知識進行更全面的了解,還請參閱《Java(TM) Sound Programmer Guide》。以下僅列出J2SE(TM) 5.0在聲音處理技術中改進的部分:
1、 現在端口可在所有平臺上使用(RFE 4782900)。
2、 現在 MIDI 設備 I/O 可在所有平臺上使用(RFE 4812168 和 RFE 4782924)。
3、 在所有平臺上實現了優化的直接音頻訪問 (RFE 4908240 和 RFE 4908879)。在提供本機混合的系統上(如具有硬件混合的 Linux ALSA、啟用的 Solaris Mixer 和 Windows DirectSound),默認情況下啟用了它。
4、 新的實時序列與所有 MIDI 設備一起工作,并允許無限地進行傳送(RFE 4773012)。
5、 sound.properties 配置文件允許選擇默認設備(RFE 4776511)。 有關更多信息,請參見 MidiSystem 和 AudioSystem。
6、 MidiDevices 可以查詢連接的接收器和傳送器(RFE 4931387, MidiDevice.getReceiver 和 MidiDevice.getTransmitter 方法)。
7、 AudioFormat、AudioFileFormat 和 MidiFileFormat 現在具有一些屬性來允許進一步描述和限定格式 (RFE 4925767 和 RFC 4666845)。
8、 一組易用的方法集允許更加容易地從 AudioSystem 檢索行(RFE 4896221)。
序列接口是用循環方法擴展的,它可以在 MIDI 序列的特定部分進行無縫循環。(RFE 4204105)。
9、Java Sound 不再禁止 VM 退出(bug 4735740)。
J2SE(TM) 5.0在Java 2D技術及圖像I/O方面在應用方面并沒有進行過多的更改,多數還是保持在原來的狀態,但是很多更改的部分在Java語言中扮演著重要的角色,而且其中的更改部分仍然代表著Java語言一貫堅持的前進方向。在J2SE(TM) 5.0之前所有針對圖象操作 在BufferedImage內增加了預讀功能,并適時地針對圖象處理加入了一些硬件加速的處理方法,如:Image類中的setAccelerationPriority and getAccelerationPriority。
另外,還添加了 2D 特性包括擴展的 Linux 和 Solaris 打印機支持、用于從文件和流中創建字體的新方法和與 VolatileImages 和圖像的硬件壓縮有關的新方法。對文本呈現代碼的大量更改大大提高了它的強健性、性能和可伸縮性。其他性能工作包括在 Linux 和 Solaris 上使用 OpenGL 進行硬件加速呈現(默認情況下是禁用的)。以上性能的引入將使Java語言在桌面系統中的應用變得更加簡單實用。
而在圖像 I/O方面,增加了具有針對 BMP 和 WBMP 格式的閱讀器和編寫器,即可以用XML語言進行控制來處理相應的圖像,增強了整個系統的重用性。
J2SE(TM) 5.0版本提供了許多 AWT 增強功能和修補程序,其中包括一些客戶經常要求的一些增強功能和修補程序。特別是新的 MouseInfo 類使得可以決定桌面上鼠標的位置。新的 Window 方法使得可以根據平臺來指定最近創建的窗體(或幀)的默認位置。另一個窗口增強功能使得可以保證窗體(或幀)總是處在最上層(對于 Solaris/Linux 上的一些窗體處理器,這種特性是不能工作的)。在數據轉換方面,新的 DropTargetDragEvent API 使得在拖動過程中可以讓目標訪問傳送的數據。這些API的引入不管從哪一方面都在很大程度上增強了Java語言的易用性。
Swing在這次Java的變更中扮演著一個極其重要的角色,它的變更已經不僅僅停留在更改幾個API,而是在實現的理念里添加進了新的實現元素,這勢必會影響Java在桌面系統應用里UI的構架設計。Swing是Java在桌面系統中最主要的應用技術,從其出現伊始就廣受人們的關注,而且Sun公司也一直將它作為Java在桌面系統的主流技術進行推廣。在J2SE(TM) 1.4.2 中, Swing 提供了兩種外觀:XP 和 GTK。但這沒有到此就停止,在J2SE(TM) 5.0中Swing為我們提供了另外兩種外觀:Synth —— 可切換皮膚的外觀和 Ocean —— 針對 Metal 的新主題。摒棄了1.4默認的陳舊的Metal外觀之后,J2SE(TM) 5.0引入了一個全新的Ocean外觀。以Sun公司 SwingSet2演示程序作為向導,比較 Meta 外觀的原有主題 Steel 與Metal 外觀的 Ocean 主題(如下圖)。另外,我們不得
Metal 的 Steel 主題 Metal 的 Ocean 主題
不提起的是Synth,它是一個完整的外觀,而不是一個主題,它針對的并不是程序員,而是界面設計人員,讓他們不必掌握Java知識便能夠進行相應界面的選擇定制。采用了Synth后,我們不能從現有外觀或主題派生子類、修改字體或顏色,而是通過轉載不同的XML 文件以達到對相應界面的控制。其實現步驟包括將程序外觀設置成Synth模式以及編輯相對應的XML文件。設置Synth外觀模式,可以使用以下代碼:
SynthLookAndFeel synth = new SynthLookAndFeel();
Class aClass = SynthTest.class;
InputStream is = aClass.getResourceAsStream("file1.xml");
synth.load(is, aClass);
UIManager.setLookAndFeel(synth);
對于 XML 中的大多數事情來說,文件的內容由文檔類型定義(DTD)描述。只要在 XML 文件中描述組件,然后把文件傳給 SynthLookAndFeel 實例的 load() 方法,應用程序的外觀就會有所不同。以下是XML控制程序外觀的代碼:
<synth>
<style id="button">
<font name="Dotum" size="24" style="BOLD"/>
<state value="MOUSE_OVER">
<font name="System" size="48" style="ITALIC"/>
</state>
</style>
<bind style="button" type="region" key="Button"/>
</synth>
以下附上Synth的演示代碼SynthTest.java,與其相對應的XML文件可選用上面的示例代碼,將其更名為synth.xml即可:
import java.io.InputStream;
import java.text.ParseException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.plaf.synth.SynthLookAndFeel;
public class SynthTest{
private static void createGUI(){
SynthLookAndFeel synth = new SynthLookAndFeel();
try {
Class classA = SynthTest.class;
InputStream in = classA.getResourceAsStream("synth.xml");
if (in == null) {
System.err.println("Unable to find theme configuration");
System.exit(-1);
}
synth.load(in, classA);
} catch (ParseException e) {
System.err.println("Unable to load theme configuration");
System.exit(-2);
}
try {
UIManager.setLookAndFeel(synth);
} catch (javax.swing.UnsupportedLookAndFeelException e) {
System.err.println("Unable to change look and feel");
System.exit(-3);
}
JFrame frame = new JFrame("Test Synth");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button = new JButton("Hello Synth");
frame.add(button);
frame.setSize(400, 200);
frame.setVisible(true);
}
public static void main(String[] args){
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run() {
createGUI();
}
});
}
}
除了外觀的調整之外,J2SE(TM) 5.0已經添加了對 JTable的打印支持,這使得可以容易地獲取 JTable 的漂亮打印副本。另外,在Java語言發展了多年后,J2SE(TM) 5.0終于實現了 JFrame.add() 等價于 JFrame.getContentPane().add()。
以上介紹的內容僅僅與大家共同領略了J2SE(TM) 5.0所帶來的新的UI元素,不圖窺一斑而知全豹,但從中仍然能看出Java前進的步伐,愿Java一路走好!
posted on 2005-07-18 22:18
永琪 閱讀(98)
評論(0) 編輯 收藏