Grafica

SWT fornisce un potente motore di grafica per il disegno di grafici e la visualizzazione di immagini nei widget. L'utente è in grado di procedere senza alcuna programmazione dell'interfaccia grafica poiché i widget gestiscono automaticamente la colorazione di icone, testo e altri dati. Tuttavia, se la propria applicazione visualizza grafica personalizzata oppure se si sta implementando un widget di disegno personalizzato, sarà necessario conoscere alcuni oggetti di disegno di base in SWT.

Contesto grafico

Il contesto grafico, GC, è il punto focale del supporto grafico SWT. La relativa API descrive tutte le capacità grafiche contenute in SWT.

Un GC può essere utilizzato per disegnare su un controllo (il caso più comune), su un'immagine, su uno schermo o su una stampante. Durante il disegno su un controllo, l'utente utilizza il GC fornito nell'evento di disegno del controllo. Durante il disegno su un'immagine, su uno schermo o su una stampante, è necessario creare un GC configurato specificamente ed eliminarlo una volta terminato l'utilizzo.

Una volta ottenuto un GC, è possibile impostarne gli attributi, ad esempio il colore, la larghezza delle righe e il tipo di carattere, che controllano l'aspetto della grafica disegnata nel GC.

L'API di riferimento per il GC descrive l'insieme completo delle funzioni grafiche.

Tipo di carattere

Le classi Font e FontData vengono utilizzate durante la modifica dei tipi di carattere in SWT.

FontData descrive le caratteristiche di un tipo di carattere. È possibile creare un FontData specificando un nome di tipo di carattere, lo stile e la dimensione. FontData comprende API per eseguire una query di tali attributi. Poiché la classe FontData non effettua l'assegnazione di alcuna risorsa del sistema operativo, non è necessario eliminarla.

La classe Font è l'oggetto grafico effettivo che rappresenta un tipo di carattere utilizzato nell'API di disegno. L'utente crea un Font per un Display specificando il Display e il FontData del tipo di carattere desiderato. È anche possibile eseguire una query di un Font per individuarne i relativi FontData.

Dopo aver utilizzato un Font è necessario eliminarlo.

Colori

I colori sono simili ai tipi di carattere. L'utente crea un Color per un Display specificando i valori RGB per il colore desiderato. Una volta terminato l'utilizzo di un colore assegnato, è necessario eliminarlo.

Il metodo Display getSystemColor(int) consente di eseguire una query dei colori di sistema predefiniti per la piattaforma del sistema operativo. Non liberare i colori ottenuti mediante questa tecnica.

Il modello di colore viene trattato dettagliatamente nell'articolo Modello di colore SWT.

Immagini

Le classi Image, ImageData e ImageLoader vengono utilizzate durante la modifica di immagini in SWT.

ImageData descrive i pixel effettivi dell'immagine, utilizzando la classe PaletteData per descrivere i valori di colore utilizzati. ImageData è una descrizione di un'immagine indipendente dal dispositivo e dalla piattaforma.

ImageLoader carica e salva ImageData in formati file differenti. Attualmente, SWT supporta il caricamento e il salvataggio di formati immagine BMP (bitmap Windows), ICO (icona Windows), JPEG, GIF e PNG.

Image è l'effettivo oggetto grafico che rappresenta l'immagine utilizzata nell'API di disegno. L'utente crea un'immagine per un particolare Display. Le immagini possono essere create in diversi modi:

Indipendentemente dal modo in cui crea l'Image, l'utente è responsabile della relativa eliminazione.

Ciclo di vita degli oggetti grafici

La maggior parte degli oggetti grafici utilizzati per operazioni di disegno in SWT assegna risorse nel sistema operativo sottostante e deve essere liberata in modo esplicito. Anche in questo caso si applica la stessa regola descritta in precedenza. Se si effettua la creazione utilizzando un costruttore, è necessario liberarla. Se si accede ad essa da un punto diverso, non liberarla.

Creazione

Gli oggetti grafici, come contesti di grafica, tipi di carattere, colori e immagini, vengono assegnati nel sistema operativo appena l'oggetto viene creato. La pianificazione di utilizzo dei propri oggetti grafici ne determina la creazione.

Gli oggetti grafici di uso frequente nell'applicazione possono essere creati al momento della creazione dei widget. Ciò avviene comunemente per i tipi di carattere e per i colori. Negli altri casi, è più corretto creare oggetti grafici rapidamente. Ad esempio, è possibile creare un contesto grafico in uno dei propri gestori di eventi widget per eseguire alcune operazioni di calcolo.

Se si implementa un widget personalizzato, generalmente si assegnano gli oggetti grafici di uso più frequente nel costruttore. È possibile assegnarli rapidamente se non vengono utilizzati sempre o se dipendono dallo stato di un attributo.

Disegno

Una volta assegnati i propri oggetti grafici, è possibile procedere al disegno. Eseguire sempre il disegno all'interno di un listener di disegno. Esistono casi rari, soprattutto durante l'implementazione dei widget personalizzati, in cui il disegno viene eseguito mentre si risponde a un altro evento. Tuttavia questa operazione è in genere sconsigliata. Se si ritiene che sia necessario disegnare durante la gestione di un altro evento, provare innanzitutto a utilizzare il metodo redraw() che genererà un altro evento di disegno nel sistema operativo. L'operazione di disegno all'esterno del metodo di disegno annulla le ottimizzazioni della piattaforma e può causare errori a seconda del numero di disegni sospesi nella coda degli eventi.

Quando si riceve un evento di disegno, viene fornito un GC preconfigurato per il disegno nel widget. Non liberare questo GC in quanto non è stato creato dall'utente.

Qualsiasi altro oggetto grafico deve essere assegnato durante la gestione dell'evento (o prima). Di seguito viene riportato un frammento di codice basato sull'esempio org.eclipse.swt.examples.HelloWorld5. Il colore rosso è stato precedentemente assegnato durante la creazione del widget e può quindi essere utilizzato.

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

Eliminazione

Ogni oggetto grafico assegnato dall'utente deve essere liberato una volta terminato l'utilizzo.

Il tempo richiesto per l'operazione di eliminazione dipende dal momento in cui è stato creato l'oggetto. Se si crea un oggetto grafico durante la creazione del proprio widget, si dovrebbe aggiungere un listener di eliminazione nel widget ed eliminare la grafica quando si elimina il widget. Se si crea un oggetto al momento del disegno, eliminarlo una volta terminato il disegno.

Il seguente frammento di codice mostra una versione leggermente modificata del listener di disegno. In questo esempio, il listener assegna e libera il colore rosso durante l'operazione di disegno.

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

Copyright IBM Corporation e altri 2000, 2003.