SWT 提供一健全圖形引擎在小組件中繪圖及顯示影像。您甚至不需要設計圖形介面就 可以執行更多的操作,因為小組件會為您處理圖示、文字及其他資料的繪製。如果您 的應用程式顯示自訂圖形,或您要實作自訂繪製小組件,則需要瞭解 SWT 中一些基 本的繪製物件。
圖形上下文 (GC) 是 SWT 圖形支援的焦點。其 API 說明 SWT 中所有繪製功能。
GC 可用來要求控制項(最常見的情況)或要求影像、顯示器或印表機。 當要求控制項時,您可以在控制項的繪製事件中使用提供給您的 GC。 當要求影像、顯示器或印表機時,您必須建立一個為它配置的 GC (而當您使用完後要將它除去)。
一旦取得 GC ,您就可以設定它的屬性,例如顏色、線寬和字型,這些屬性控制 GC 中繪製的圖形外觀。
GC 的 API 參照說明完整的圖形功能集。
Font 和 FontData 類別用於 SWT 中操作字型時。
FontData 說明字型性質。您可以指定字型名稱、樣式及大小來建立 FontData 。 FontData 併入用於查詢這些屬性的 API。因為 FontData 沒有配置任何 OS 資源,所以您不需要除去它。
Font 是代表繪製 API 中所使用字型的實際圖形物件。您可以為 Display 建立 Font ,方法是指定您要的字型之 Display 和 FontData。 您也可以在 Font 中查詢它的 FontData。
當使用完 Font 後 ,您必須將它除去。
顏色類似字型。您可以為 Display 建立 Color ,方法是對想要的顏色指定 RGB 值。當使用完顏色後,您必須將它除去。
Display 方法 getSystemColor 可讓您查詢 OS 平台預先定義的系統顏色。 您不應該使用此技術來釋出方法取得的顏色。
顏色模型在 SWT 顏色模型文章中有詳細討論。
Image 、 ImageData 及 ImageLoader 類別在 SWT 中操作影像時使用。
ImageData 說明影像的實際圖素,使用 PaletteData 類別來說明影像中使用的顏色值。 ImageData 為與裝置和平台無關的影像說明。
ImageLoader 以不同的檔案格式載入及儲存 ImageData 。SWT 目前支援 BMP(Windows 點陣圖)、ICO(Windows 圖示)、 JPEG、GIF 和 PNG 影像格式的載入及儲存。
Image 是代表繪製 API 中所使用影像的實際圖形物件。您可以為特定的 Display 建立影像。建立影像的方法有以下幾種:
無論您如何建立 Image ,都要負責將它除去。
在 SWT 中,用來繪製的大部份圖形物件會在基礎的 OS 中配置資源,且必須明確地釋出。 這裡套用的是先前所討論同一個簡略的規則。如果您是使用建構子建立它,您應該將 它釋出。如果您是從別處取得它的存取權,則不要將它釋出。
在 OS 中配置了圖形物件(例如圖形上下文、字型、顏色及影像),就會建立物件。 您打算如何使用圖形物件會決定應該建立它們的時機。
如果您經常在整個應用程式中使用圖形物件,您可以在建立小組件的同時建立它們。 通常這是針對顏色和字型來執行。在其他情況下,更適合快速建立您的圖形物件。 例如,您可以在其中一個小組件事件處理程式中建立圖形上下文來執行一些計算。
如果您實作自訂小組件,而且您固定使用一些圖形物件,通常要在建構子中配置它們 。 如果您不要固定使用它們或它們與某個屬性的狀態有關,您可以快速配置它們。
一旦配置圖形物件後,您就可以開始繪製了。 一律在繪製接聽器內執行您的繪 製。 在繪製時回應另一個事件是很罕見的情形(特別是在實作自訂小組件時)。 通常不鼓勵您這麼做。如果您需要在繪製時處理另一事件,您應該先嘗試使 用 redraw 方法,它會在 OS 中產生另一個繪製事件。超出 paint 方法的繪 製會使平台最佳化失效,甚至導致錯誤出現,這取決於事件佇列中擱置的繪製數而 定。
當接收繪製事件時,會提供您在小組件中繪製預先配置的 GC。 請勿釋出這個 GC! 因為您尚未建立它。
其他任何圖形物件必須在處理事件的同時(或事先)配置。下面是依據 org.eclipse.swt.examples.HelloWorld5 範例的片段。顏色 red 先前已在 建立小組件時配置,所以可在此使用它。
shell.addPaintListener(new PaintListener () {
public void paintControl(PaintEvent event){
GC gc = event.gc;
gc.setForeground(red);
Rectangle rect =
event.widget.getClientArea();
gc.drawRectangle(rect.x + 10,
rect.y + 10, rect.width - 20, rect.height - 20);
gc.drawString(resHello.getString("Hello_world"), rect.x + 20,
rect.y + 20);
}
});
您配置的每個圖形物件都必須在使用完後釋出。
除去的時間視您建立物件的時間而定。如果您在建立小組件的同時建立圖形物件,通 常應在小組件上新增除去接聽器,而在除去小組件時除去圖形。如果您在繪製時快速 建立某物件,則應在繪製完成後將它除去。
下一個程式碼片段顯示繪製接聽器的小幅修改版本。在這個範例中,會在繪製的同時配 置並釋出顏色 red。
shell.addPaintListener(new PaintListener () {
public void paintControl(PaintEvent event){
GC gc = event.gc;
Color red = new
Color(event.widget.getDisplay(), 0xFF, 0, 0);
gc.setForeground(red);
Rectangle rect =
event.widget.getClientArea();
gc.drawRectangle(rect.x + 10,
rect.y + 10, rect.width - 20, rect.height - 20);
gc.drawString(resHello.getString("Hello_world"), rect.x + 20,
rect.y + 20);
red.dispose();
}
});