打造專業外觀-九宮圖
長久以來,Java被認為是服務器端的佼佼者,而在客戶端方面不被看好,特別地MicroSoft的Windows系列幾乎壟斷了桌面應用。所以在大多數人看來只要一提起開發客戶端,首先想到的是VB、Delph。拒絕Java的原因無非是速度慢、Swing外觀丑陋這2點。對于前者已經成為歷史了,而對于后者,抱怨Java設計的界面丑陋的那些人一定桌面開發經驗淺顯、或者只會依賴VB那種托拽生成組件的那些非高手。再有可能就是傳統桌面開發員中的VB忠實fans,他們不愿意接受新東西。其實目前而言,Java開發桌面應用不僅能將上述缺點消除,Java最重要的是能夠跨平臺運行,這是其他語言不能達到的,如果客戶端使用VB開發的話,那么還可能要考慮系統其他部分的開發是否也要用VB或者微軟支持的產品。目前用Java語言開發的客戶端已不少見,IBM Lotus旗下的Sametime系列就是很好的例子,雖然其7.5已經將界面全部改為SWT實現而不再是AWT,但至少能說明Java作為桌面開發絕不是弱者。而且調查顯示Visual Basic開發用戶直線下降。詳見http://blog.sina.com.cn/s/blog_4b6047bc010006v9.html
對于一般界面需求而言,簡單的桌面組件完全可以滿足用戶的需求,這些簡單至極的組件已經被集成進組件托盤中了,如果你用netbeans或者安裝Eclipse的VE插件,完全可以只通過托拽的方式將組件生成并放置在指定的地方。至多需要你對常用布局管理器有少許了解。但是單憑這些現有的玩意很難打造出專業的外觀。比如一個頂層窗口,如果你用swing組件庫中的JFrame或SWT中的Shell,那么它的外觀充其量和本地的外觀一致,這個本地化外觀有窗口的標題欄,標題欄文字出現的位置,Windows是圖標左對齊,Solaris是居中,和默認的最小化、最大化、關閉等按鈕。另外還有固定尺寸和外觀的邊框,盡管在Windows Vista中這些元素已經很美觀,但是某些軟件如即時通訊類軟件,美工一定會單獨設計出一套截然不同的外觀叫你去實現。就拿一個窗口來說,如下圖:
我從事Java桌面相關的工作有1年半了,起初我依賴JButton、JScroll等基礎組件,BorderLayout、FlowLayout等現成的布局管理器企圖能實現類似MSN的外觀效果,但是實際看來是完全不可能的,所以我當時就下了這樣的結論,哪怕現在我依然認為是正確的:“拋棄所有的外觀設計工具和一切現有的桌面組件及布局管理器,一切的一切必須自定義實現,設計工具最多能替你完成一半”。所以當時界面部分的代碼是我一行一行寫出來的,為了不做重復的勞動,定義了不少組件如Button,CheckBox,ComboBox(參見用SWT實現MSN風格的下拉框)、Slider(參見SWT自定義組件之Slider)。
布局管理器完全不用,因為它會給你的組件布局帶來很大限制。取而代之的是為容器組件添加ComponentListener監聽器(SWT的實現是ControlListener)。
下列是我基于這個理念開發的界面截圖。
作為打造專業外觀的第一步,應該學會如何去分解。介紹一種常見的分解方法——九宮格。如下圖所示
九宮格的設計思想是將組件分成9個組成部分,四個邊、四個角、中心部分作為內容放置其他組件。為了敘述方便,這9個部分依次取名為northwest(左上)、northeast(右上)、north(北)、southwest(左下)、southeast(右下)、south(南)、west(西)、east(東)、content(中心內容窗格)。
這9個部分的布局不難理解,例如northwest始終位于左上,無論窗口大小如何變動northwest都不會改變大小和位置;同理northeast始終位于右上位置;而north的左邊緊貼northwest的右端、右邊緊貼northeast的左邊,所以north的長度計算應該是窗口的長度減去northwest和northeast的長度之和。同理,剩下幾部分的布局不難計算。
還有一點是很重要的,如果你是用SWT組件,務必把Shell的樣式設置成SWT.NO_TRIM,也就是說這樣的頂層窗口沒有標題欄和邊框,一些由你來修飾。如果你用Swing,請使用JWindow而不是JFrame,道理同上。
雖然上述實現界面程序是用SWT編寫的,但是不代表SWT很強大,Swing才是王者,你可以這樣理解,SWT這樣的怪胎都能做出如此效果,Swing更沒問題了。
參考程序這里下載
本文只是介紹了九宮格的概念,在實際開發中可能需要對九宮格分解法進行擴展,比如在九宮格的基礎上再分解,粒度由你來掌握。演示程序窗口只是簡單地實現了邊框和內容窗格的渲染,不能拖拽移動和改變尺寸、沒有標題和功能按鈕,如果你仔細看還會發現邊角沒有被抹去,也就是說被有實現圓角窗口,這些功能會在后續的文章中一一介紹如何實現。
至于上面所說UI代碼一行一行寫出來,是有些費事,對于這個問題我的看法是這樣的:某些界面是不需要花大力氣渲染的,比如說配置界面,沒有哪些客戶端要求那種界面也強調很酷的外觀,所以對于簡單的界面,可以借助工具生成代碼,必定工具還是可以幫你做50%的事情。第二就積累一些組件庫,比如自定義一些可重用組件,就像前面介紹的ComboBox和Slider,如果不能完全重用,至少可以將代碼作為模板,少許改動就可變成另一套外觀風格,研讀前面介紹的ComboBox和Slider你會發現替換里面的圖片或顏色常量就可輕松換膚,如果你的UI是基于swing的,那么你可以自定義L&F來實現基本的外觀,關于L&F后面定會花大量時間整理出完整教程。第三就是利用配置的方式將UI組件的生成和布局從.java中移出來,這樣不僅可以省去大部分代碼量,而且配置文件簡短易讀的特點是眾所周知的,Java Web項目的web.xml就是很好的例子,Spring就更不用說了。配置方式后面也會介紹。第四點,如果你只會VB、VC那種拖拽式開發,那你永遠算不上高手,我曾經用MFC寫程序時抱怨過“有那么多按鈕卻看不見一行CButton聲明”,那會使你永遠不了解底層是如何實現的,所以我不喜歡那種方式,如果你有能力,完全可以寫一個Framework封裝你的UI組件,配置生成的方式就是一例。
今后還會寫大量關于Java GUI方面的帖子,并且會和Sun工程研究院的陳維雷先生合作發布L&F技術貼,他的博客https://blogs.oracle.com/Swing/想必大家很熟悉了。雖然當今的web2.0時代人們很少關注C/S應用,但是一些高端應用仍舊采用C/S模式,瀏覽器這個通用客戶端能做的事還很有限。而且Sun也開始向桌面進軍,JDK1.6的進步就能很好地說明這一點,更另人興奮的是Java桌面技術有添加了一個新成員——JavaFX,又有好消息稱JDK7.0中的AWT將加入不規則窗體和半透明窗體的支持,希望有一天Swing能壟斷桌面。
posted on 2007-11-03 17:56 sun_java_studio@yahoo.com.cn(電玩) 閱讀(18207) 評論(45) 編輯 收藏 所屬分類: NetBeans 、GUI Design