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