s
SWT 提供一健全圖形引擎在 Widget 中繪圖及顯示影像。您甚至不需要設計圖形介面就 可以執行更多的操作,因為 Widget 會為您處理圖示、文字及其他資料的繪製。然而, 如果您的應用程式顯示自訂圖形,或您要實作自訂的繪製 Widget,則需要瞭解 SWT 中一些基礎的繪製物件。
圖形環境定義(GC)是 SWT 圖形支援的焦點。其 API 說明 SWT 中所有繪製功能。
GC 可用於在控制項(最常見的情況)上繪製、在影像上繪製、在顯示畫面上繪製, 或繪製至印表機。在控制項上繪製時,您可以在控制項的繪製事件中,使用提供給您的 GC 。當在影像、顯示畫面或印表機上繪製時, 您必須建立一個已配置給它的 GC ,然後在使用完,將 GC 除去。
一旦取得 GC ,您就可以設定它的屬性,例如顏色、線寬和字型,這些屬性控制 GC 中繪製的圖形外觀。
GC 的「API 參照」說明完整的圖形功能集。
在 SWT 中操作字型時,將使用 Font 和 FontData 類別。
FontData 說明字型性質。您可以指定字型名稱、樣式及大小來建立 FontData 。 FontData 併入用於查詢這些屬性的 API。因為 FontData 沒有配置任何 OS 資源,所以您不需要除去它。
Font 是代表繪製 API 中所使用字型的實際圖形物件。您可以為 Display 建立 Font ,方法是指定您要的字型之 Display 和 FontData。 您也可以在 Font 中查詢它的 FontData。
當使用完所配置的 Font 後 ,您必須將它除去。
顏色類似字型。您可以為 Display 建立 Color,方法是對想要的顏色指定 RGB 值。 在使用完所配置的顏色之後,您必須將它除去。
Display 方法 getSystemColor(int) 可讓您查詢 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 中配置了圖形物件(例如圖形環境定義、字型、顏色及影像),就會建立物件。 您打算如何使用圖形物件會決定應該建立它們的時機。
如果您在整個應用程式中大量使用圖形物件,您可以在建立 Widget 的同時建立它們。 通常這是針對顏色和字型來執行。在其他情況下,更適合快速建立您的圖形物件。 舉例來說,您可以在其中一個 Widget 事件處理程式中建立圖形環境定義來執行一些計算。
如果您實作自訂 Widget,而且您固定使用一些圖形物件,通常要在建構子中配置它們。 如果您不要固定使用它們或它們與某個屬性的狀態有關,您可以快速配置它們。
一旦配置圖形物件後,您就可以開始繪製了。 您應該固定在繪製接聽器內執行您的繪製。 在繪製時回應另一個事件是很罕見的情形(特別是在實作自訂 Widget 時)。然而,通常不鼓勵您這麼做。 如果您需要在繪製時處理另一事件,您應該先嘗試使用 redraw() 方法, 它會在 OS 中產生另一個繪製事件。超出 paint 方法的繪製會使平台最佳化失效, 因而導致錯誤出現,這取決於事件佇列中擱置的繪製數目而定。
當接收繪製事件時,會提供您在 Widget 中繪製預先配置的GC。 請勿釋出這個 GC! 因為您尚未建立它。
其他任何圖形物件必須在處理事件的同時(或事先)配置。下面是依據 org.eclipse.swt.examples.HelloWorld5 範例的片段。顏色 red 先前已在 建立 Widget 時配置,所以可在此使用它。
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); } });
您配置的每個圖形物件都必須在使用完後釋出。
除去的時間視您建立物件的時間而定。如果您在建立 Widget 的同時建立圖形物件,通 常應在 Widget 上新增除去接聽器,而在除去 Widget 時除去圖形。如果您在繪製時快速 建立某物件,則應在繪製完成後將它除去。
下一個程式碼片段顯示繪製接聽器的小幅修改版本。在這個範例中,會在繪製的同時配 置並釋出顏色 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(); } });