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. Se la propria applicazione contiene grafica personalizzata, oppure se si sta implementando un widget di disegno personalizzato, sarà necessario conoscere alcune informazioni di base per il disegno di oggetti 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 il disegno su un controllo (il caso più comune) oppure su un'immagine, uno schermo o una stampante. Durante il disegno di un controllo, l'utente utilizza il GC fornito nell'evento di disegno del controllo. Durante il disegno su un'immagine, uno schermo o una stampante, è necessario creare un GC configurato specificamente (e disporne 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 in GC.

L'API di riferimento per GC descrive la serie completa delle funzioni grafiche.

Tipo di carattere

La 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 la query di tali attributi. Poiché FontData non effettua l'allocazione di nessuna risorsa del sistema operativo, non è necessario disporne.

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

Una volta terminato l'utilizzo, è necessario disporre di un Font.

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, l'utente deve disporre di un colore.

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

Il modello di colore viene trattato dettagliatamente in Modello di colore SWT.

Immagini

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

ImageData descrive gli effettivi pixel nell'immagine, utilizzando la classe PaletteData per descrivere i valori dei colori presenti nell'immagine. ImageData è una descrizione, indipendente dal dispositivo e dalla piattaforma, di un'immagine.

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:

Non importa il modo in cui l'utente crea un Image, tuttavia l'utente stesso è responsabile della sua eliminazione.

Ciclo di vita degli oggetti grafici

La maggior parte degli oggetti grafici utilizzati per operazioni di disegno in SWT allocano risorse nel sistema operativo sottostante e devono essere esplicitamente liberati. La stessa regola di anteprima trattata in precedenza si applica in questo caso. 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 allocati nel sistema operativo appena l'oggetto viene creato. La pianificazione di utilizzo dei propri oggetti grafici ne determina la creazione.

Gli oggetti grafici utilizzati pesantemente in tutta l'applicazione possono essere creati nel momento della creazione dei widget. Ciò avviene comunemente per i tipi di carattere e per i colori. Negli altri casi, è più adatta la creazione di oggetti grafici al momento. Ad esempio, è possibile creare un contesto di grafica in uno dei propri gestori degli eventi del widget per eseguire alcune operazioni di calcolo.

Se si sta implementando un widget personalizzato, generalmente gli oggetti grafici che vengono sempre utilizzati sono allocati nel costruttore. Si potrebbe effettuare l'allocazione al momento se non vengono sempre utilizzati oppure se dipendono dallo stato di qualche attributo.

Painting

Una volta allocati i propri oggetti grafici, è possibile procedere con il painting. Eseguire sempre il painting all'interno di un listener di paint. Esistono rari casi (soprattutto durante l'implementazione di widget personalizzati) in cui si esegue il paint mentre si risponde ad un altro evento. In generale questa operazione è sconsigliata. Se è necessario eseguire il paint durante la gestione di un altro evento, provare prima ad utilizzare il metodo redraw, che genera un altro evento paint nel sistema operativo. L'operazione di disegno eseguita al di fuori del metodo paint potrebbe pregiudicare le ottimizzazioni della piattaforma e può anche causare errori a seconda del numero di azioni paint sospese nella coda degli eventi.

Quando si riceve un evento paint, verrà fornito all'utente un GC preconfigurato per il disegno nel widget. Non liberare questo GC! Non è stato l'utente a crearlo.

Qualsiasi altro oggetto grafico deve essere allocato 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 allocato durante la creazione del widget e può quindi essere utilizzato ora.

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

Disposizione

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

I tempi dell'eliminazione dipendono dal momento in cui l'oggetto è stato creato. Se si crea un oggetto grafico durante la creazione del proprio widget, si dovrebbe aggiungere un listener di eliminazione nel widget e eliminare la grafica quando si elimina il widget. Se si crea un oggetto al momento del painting, si dovrebbe eliminare una volta terminato il painting.

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

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