本文主要譯自《SWT/JFace inaction》附錄C,并結合譯者實(shí)踐經(jīng)驗整理。譯者認為討論一點(diǎn)純粹Draw2D的東西是有必要的,因為第一,并不是所有的應用都必須(或者適合)使用GEF;第二,Draw2D是GEF的基礎,對Draw2D知之甚少的情況下學(xué)習GEF,往往學(xué)習曲線(xiàn)比較陡,因為其中哪些是Draw2D的概念,哪些是GEF的概念往往難以厘清。本文假設讀者有SWT基礎。
1、理解Draw2d
Draw2d是SWT平臺上的圖形庫,你可以用它定制屬于自己的、不依賴(lài)于特定操作系統本地組件的上層組件;
也可以用它開(kāi)發(fā)基于圖形的應用程序。一般來(lái)說(shuō),基礎代碼編寫(xiě)者/GUI組件提供者們使用前一個(gè)功能,像譯
者這樣開(kāi)發(fā)應用程序的人則使用后者更多一些。
Draw2d庫依賴(lài)于SWT(不依賴(lài)JFace),提供了完整的圖形應用程序開(kāi)發(fā)包,使用它你幾乎可以作出任意的
圖形,但是除了簡(jiǎn)單的幾何圖形以外,任何圖形都需要開(kāi)發(fā)者自己手繪、或者用已有的圖形進(jìn)行組合;同時(shí),
如果你想讓你的圖形響應各種事件(鼠標/鍵盤(pán)/拖拽等),也必須事事躬親,顯然自由的代價(jià)就是繁冗的代碼
:( 。
本文從Draw2d的核心類(lèi)及其方法講起,然后理論結合實(shí)踐,以一個(gè)flowchart(程序流程圖)為例子進(jìn)行實(shí)
戰演習,同時(shí)會(huì )講到拖拽(drag-and-drop, 簡(jiǎn)寫(xiě)作dnd),以及如何使用Connector對象連接兩個(gè)圖形等。
1.1、使用Draw2d基礎類(lèi)
Draw2d在設計結構上有些類(lèi)似SWT:兩者使用某些共同的類(lèi)(確切說(shuō)是Draw2d使用SWT的類(lèi));描繪(drawing)、
事件處理和組件的布局等機制都有相似的結構,對應如表C.1。實(shí)際上,所有的Draw2d GUI必須都放在某個(gè)
SWT Canvas上。Draw2d和SWT的第一個(gè)區別是:在SWT中,一個(gè)Canvas用一個(gè)GC對象來(lái)提供繪圖功能,但在
Draw2d中Canvas使用名為L(cháng)ightweightSystem的對象。
表C.1
LightweightSystem好比SWT中的Display,沒(méi)有具體的形狀,但是提供事件處理機制以及負責與外部環(huán)境
通信。正如它的名字,LightweightSystem不依賴(lài)于特定操作系統,這意味著(zhù)你失去了SWT/Jface重量級組件
的優(yōu)勢,比如快速的響應和本地外觀(guān)風(fēng)格,但你得到的,是對自己的組件的外觀(guān)與行為的完全控制。
毫無(wú)疑問(wèn),Draw2d中最重要的類(lèi)是Figure,你會(huì )看到,我們講Draw2d,大部分是在講它的方法以及子類(lèi)。
就像SWT的組件都要放到一個(gè)Shell上一樣,Figure必須放到LightweightSystem上以便顯示。如同SWT的Control
一樣,Figure可以調整大小和位置,添加Listeners和LayoutManagers,以及設置顏色和字體。同時(shí),一個(gè)Figure
又相當于SWT中的一個(gè)Composite,可以在其上添加其他的Figure,即作為其他Figure的容器。見(jiàn)圖C.1。
圖C.1
然而,不同于Control和Widget的是,你可以隨心所欲地繼承Figure。Figure的圖形可以繪制(drawing)
也可以使用圖片。Figure不僅可以使用單獨的Listener接口,而且可以自己處理大部分事件;甚至可以發(fā)起某
些事件來(lái)喚醒GUI中的其他對象。
為了向Figure中加入圖片或者進(jìn)行手繪,你需要用到Graphics對象。他就像SWT中的GC一樣,提供了在一個(gè)給
定區域畫(huà)圖的方法。Graphics類(lèi)的很多方法和GC的完全一樣,尤其是繪制線(xiàn)和幾何圖形、顯示圖片以及字體等方
面。但Graphics還提供了一個(gè)不同于GC的功能:它的對象可以在LightweightSystem中移動(dòng)。這意味著(zhù)當你想要
改變一個(gè)圖形組件的位置時(shí),Draw2d提供了它自己的拖拽機制來(lái)將一個(gè)Figure移動(dòng)到合適的位置。
1.2、Flowchart應用實(shí)例
我們的應用實(shí)例是一個(gè)程序流程圖,如圖C.2所示。
圖C.2
聯(lián)系客服