圖形

SWT 提供一個圖形引擎在小組件中繪圖及顯示影像。您甚至不需要設計圖形介面就 可以執行更多的操作,因為小組件會為您處理圖示、文字及其他資料的繪製。然而, 如果您的應用程式顯示自訂圖形,或您要實作自訂的繪製小組件,則需要瞭解 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 顏色模型文章中有詳細討論。

影像

ImageImageDataImageLoader 類別在 SWT 中操作影像時使用。

ImageData 說明影像的實際像素,使用 PaletteData 類別來說明已使用的顏色值。 ImageData 是與裝置和平台無關的影像說明。

ImageLoader 以不同的檔案格式載入及儲存 ImageData。SWT 目前支援 BMP(Windows 點陣圖)、ICO(Windows 圖示)、JPEGGIFPNG 影像格式的載入及儲存。

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();
      }
   });