Disegnare il testo è facile con tre classi Java

Oltre ai metodi per disegnare tipi geometrici primitivi come linee e cerchi, la Graphicsclasse fornisce metodi per disegnare testo. Quando combinato con le classi Fonte FontMetrics, il risultato è un insieme di strumenti che rende il lavoro di disegnare un testo accattivante molto più semplice di quanto sarebbe altrimenti. Questa colonna coprirà ciascuna di queste classi a turno e ti mostrerà come usarle insieme. Prima di iniziare, tuttavia, è necessaria una breve rassegna del ruolo della Graphicsclasse.

Una recensione

Per poter utilizzare i metodi testuali della Graphicsclasse, è richiesta una comprensione del ruolo della Graphicsclasse stessa. Questa sezione presenta una breve panoramica della funzione e del funzionamento della Graphicsclasse. I lettori che cercano una copertura approfondita dovrebbero leggere la mia colonna di ottobre, disponibile qui.

La Graphicsclasse svolge due ruoli diversi ma correlati all'interno dell'astratto windowing toolkit (AWT). Innanzitutto, mantiene il contesto grafico, che consiste in tutte le informazioni che influenzeranno il risultato di un'operazione grafica. Ciò include il colore del disegno, il carattere e la posizione e le dimensioni del rettangolo di ritaglio (l'area in cui è possibile disegnare la grafica). Ancora più importante, il contesto grafico definisce la destinazione per le operazioni grafiche che verranno discusse (le destinazioni includono componenti e immagini).

In aggiunta al suo ruolo di contesto grafico, la Graphicsclasse fornisce metodi per disegnare forme geometriche semplici, testo e le immagini per la destinazione grafica. Tutte le operazioni relative alla grafica su un componente o un'immagine avvengono tramite uno di questi metodi.

Per disegnare, un programma richiede un contesto grafico valido (rappresentato da un'istanza della Graphicsclasse). Poiché la Graphicsclasse è una classe base astratta, non può essere istanziata direttamente. Un'istanza viene in genere creata da un componente e quindi passata al programma come argomento dei metodi update()e di un componente paint(). Questi due metodi vengono chiamati come parte del normale ciclo di disegno avviato all'interno dell'AWT.

La Graphicsclasse collabora con le classi Fonte FontMetricsper fornire gli strumenti necessari per disegnare il testo all'interno di un'immagine o di un componente. Cominciamo esaminando i Graphicsmetodi della classe per disegnare il testo.

Grafica di classe

La Graphicsclasse fornisce tre metodi che disegnano il testo su un componente o un'immagine.

void drawString (String str, int x, int y)

Il drawString()metodo, mostrato di seguito, prende come parametri un'istanza della Stringclasse contenente il testo da disegnare e due valori interi che specificano le coordinate in cui il testo deve iniziare.

public void paint (Graphics g) {g.drawString ("abc", 25, 25); }

Il codice nell'elenco sopra mostra il drawString()metodo in uso all'interno del paint()metodo di un componente . Il codice in questo esempio disegna la parola "abc" sul componente che contiene questo paint()metodo. Il x ed y coordinate specificano la posizione del basso a sinistra angolo della casella di testo racchiude. La Figura 1 mostra come sarebbe il risultato se questo codice facesse parte di un oggetto componente AWT adatto.

Figura 1: una dimostrazione di drawString ()

void drawChars (char [] data, int offset, int length, int x, int y)

Il drawChars()metodo seguente prende come parametri un array di caratteri contenente il testo da disegnare, un valore intero che indica l'offset nell'array da cui iniziare, un valore intero che indica il numero di caratteri da disegnare e due valori interi che specificano le coordinate in cui il il testo dovrebbe iniziare.

public void paint (Graphics g) {char [] rgc = {'a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'j'};

g.drawChars (rgc, 0, 5, 25, 25); g.drawChars (rgc, 5, 5, 25, 50); }

Il codice sopra mostra il drawChars()metodo in uso all'interno del paint()metodo di un componente . La matrice dei caratteri è composta da due parti. Nella prima delle due chiamate a drawChars(), il parametro offset indica che il disegno deve iniziare con il primo carattere della matrice e il parametro length indica che sulla prima riga deve essere disegnato un totale di cinque caratteri. La seconda delle due chiamate funziona in modo simile ma disegna gli ultimi cinque caratteri nella matrice di caratteri a partire da una posizione di 25 pixel sotto la prima. La Figura 2 mostra come sarebbe il risultato se questo codice facesse parte di un oggetto componente AWT adatto.

Figura 2: una dimostrazione di drawChars ()

void drawBytes (byte [] dati, int offset, int length, int x, int y)

Come mostrato di seguito, il drawBytes()metodo accetta come parametri un array di byte contenente il testo da disegnare, un valore intero che indica l'offset nell'array da cui iniziare, un valore intero che indica il numero di byte da disegnare e due valori interi che specificano il coordinate dove dovrebbe iniziare il testo.

public void paint (Graphics g) {byte [] rgb = {'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't'};

g.drawBytes (rgb, 0, 5, 25, 25); g.drawBytes (rgb, 5, 5, 25, 50); }

Il codice sopra mostra il drawBytes()metodo in uso all'interno del paint()metodo di un componente . La Figura 3 mostra come sarebbe il risultato se questo codice fosse parte di un oggetto componente AWT adatto.

Figura 3: una dimostrazione di drawBytes ()

Supporto Unicode

Una delle caratteristiche più pubblicizzate di Java è il supporto per script internazionali tramite Unicode. È un peccato che la libreria di classi Java fornita con la versione 1.0 del linguaggio di programmazione Java non supportasse completamente questo aspetto del linguaggio. Tuttavia, sembra che le buone notizie siano dietro l'angolo. L'API di internazionalizzazione preliminare (vedi Risorse), disponibile da SunSoft, ha questo da dire:

JDK 1.0 era limitato a visualizzare solo i caratteri nel sottoinsieme Latin-1 di Unicode. Questa restrizione è stata rimossa in JDK 1.1. I programmi Java saranno ora in grado di visualizzare qualsiasi carattere Unicode che può essere reso con un carattere host. Java fornisce un piccolo numero di nomi di font "virtuali" predefiniti e li mappa su font reali disponibili sull'host. In JDK 1.0, ogni nome di carattere Java mappato esattamente a un carattere host. In JDK 1.1, un nome di carattere Java può essere mappato a una serie di caratteri host. La serie di caratteri host può essere scelta per coprire tutta la serie di caratteri Unicode desiderata.

Posizionamento del testo

Poiché il testo è solo un altro tipo di figura per l'AWT, una riga di testo può essere posizionata ovunque, anche sopra un'altra riga di testo. L'effetto del posizionamento casuale, tuttavia, non sarà necessariamente piacevole alla vista. Al fine di assistere il programmatore nella produzione di testo esteticamente gradevole, una definizione di font include linee guida per il posizionamento di linee e caratteri. Queste linee guida, se seguite, aiuteranno a produrre risultati soddisfacenti.

La Figura 4 contiene una riga di testo che è stata contrassegnata per indicare le caratteristiche di cui stiamo per discutere.

Figura 4: una riga di testo

Il parametro della coordinata y nei metodi nella sezione precedente specifica la posizione della linea di base di una riga di testo. La linea di base è la riga su cui poggia la maggior parte dei caratteri in una riga di testo (ad eccezione di quei caratteri con discendenti come "g" e "y"). La linea di base non è propriamente una caratteristica di un font ma è il punto di riferimento a cui si riferiscono tutte le altre caratteristiche.

L' ascesa è la distanza dalla linea di base alla parte superiore della maggior parte dei caratteri in un font. Tipicamente è l'altezza delle lettere maiuscole nel font e di caratteri come "f" e "h". Questa cifra è solo una linea guida, tuttavia. Alcuni caratteri nel font possono effettivamente estendersi oltre questa distanza.

La discesa è la distanza dalla linea di base alla parte inferiore dei caratteri in un font che ha discendenti - caratteri come "p", "g" e "y". Come per l'ascesa, questa cifra è solo una linea guida. Alcuni caratteri nel font possono effettivamente estendersi al di sotto di questa distanza.

L' interlinea (pronunciato "ledding") è la quantità di spazio tra la discesa di una riga di testo e l'ascesa della riga sottostante. L'altezza di una riga di testo (la distanza dalla linea di base di una riga di testo alla linea di base di una riga di testo sopra o sotto di essa) include questo spazio extra.

Oltre alle caratteristiche che governano un font nel suo insieme, ogni carattere in un font ha un anticipo . L'avanzamento specifica quanti pixel separano l'inizio del carattere dall'inizio di un carattere alla sua destra; in breve, è la larghezza di un personaggio. Ancora una volta, alcuni caratteri in un font possono effettivamente estendersi oltre questa distanza.

Sommando le larghezze di tutti i caratteri in una riga di testo, è possibile calcolare la lunghezza dell'intera riga di testo. La FontMetricsclasse seguente fornisce un metodo che fa proprio questo e altro ancora.

Classe FontMetrics

La FontMetricsclasse fornisce un modo semplice per ottenere le caratteristiche discusse sopra. Ecco il getFontMetricsmetodo in azione:

public void paint (Graphics g) {FontMetrics fm = g.getFontMetrics (); . . . }

Il codice sopra mostra come è possibile ottenere le informazioni sulla metrica dei caratteri che descrivono il carattere corrente. Il getFontMetrics()metodo restituisce un'istanza della FontMetricsclasse. La FontMetricsclasse fornisce i seguenti metodi:

int getAscent()

  • Restituisce l'ascesa del font.

int getDescent()

  • Restituisce la discesa del carattere.

int getLeading()

  • Restituisce l'interlinea del carattere.

int getHeight()

  • Restituisce l'altezza del carattere. L'altezza è la somma di salita, discesa e interlinea del carattere.

int charWidth(int ch)

  • Restituisce la larghezza del carattere specificato.

int charWidth(char ch)

  • Restituisce la larghezza del carattere specificato.

int [] getWidths()

  • Restituisce un array di numeri interi contenente le larghezze dei primi 256 caratteri del font.

Come accennato in precedenza, i caratteri che compongono un font a volte possono estendersi oltre l'ascesa, la discesa e le larghezze riportate dai metodi sopra. Nei casi in cui sono richiesti valori esatti, vengono forniti i seguenti metodi.

int getMaxAscent()

  • Restituisce l'ascesa massima del carattere.

int getMaxDescent()

  • Restituisce la discesa massima del carattere.

int getMaxAdvance()

  • Restituisce la larghezza del carattere più largo nel font.

I seguenti metodi forniscono informazioni sulla larghezza occupata da una sequenza di caratteri.

int stringWidth(String str)

  • Restituisce la larghezza della sequenza di caratteri.

int bytesWidth(byte [] rgb, int offset, int length)

  • Restituisce la larghezza della sequenza lunga lunghezza di byte che iniziano all'offset .

int charsWidth(char [] rgc, int offset, int length)

  • Restituisce la larghezza della lunghezza lunga sequenza di caratteri con inizio alle compensato .

Carattere di classe

La Fontclasse incapsula le informazioni su un carattere. Viene prodotto un nuovo carattere creando un'istanza della Fontclasse con un nome, uno stile e una dimensione in punti.

Carattere f = nuovo carattere ("Dialog", Font.PLAIN, 12); 

Una volta creato, un carattere può essere assegnato a un'istanza Graphicsdell'oggetto.

g.setFont (f); 

L' Graphicsoggetto utilizzerà quindi il carattere per tutte le successive operazioni grafiche relative al testo.

La Fontclasse fornisce metodi per ottenere informazioni su un carattere una volta che è stato creato.

String getName()

  • Restituisce il nome del carattere.

String getFamily()

  • Restituisce il nome specifico della piattaforma del carattere.

int getSize()

  • Restituisce la dimensione in punti del carattere.

int getStyle()

  • Restituisce lo stile del carattere.

boolean isBold()

  • Restituisce truese il carattere è in grassetto.

boolean isItalic()

  • Restituisce truese il carattere è corsivo.

boolean isPlain()

  • Restituisce truese il carattere è normale.

String getName()

  • Restituisce il nome del carattere.

Una dimostrazione

L'applet nella Figura 5 visualizza una riga di testo con markup sufficiente per indicare i valori delle metriche associate dalla sezione precedente. Una spessa linea nera si trova alla linea di base. Due linee aggiuntive indicano l'ascesa e la discesa del carattere in questione. Le linee verticali più piccole indicano la larghezza dei caratteri. I tre menu a discesa consentono di selezionare un carattere, il suo stile e la sua dimensione in punti.

È necessario un browser abilitato per Java per visualizzare questa applet. Figura 5: un browser metrico dei caratteri interattivo

L'applet utilizza le Graphics, Fonte FontMetricsclassi ampiamente. La sua fonte è disponibile qui.

Conclusione

Sembra che la Graphicsclasse si sia rivelata un terreno molto fertile per l'esplorazione. E la spedizione non è ancora finita. Il mese prossimo terminerò la mia escursione in Graphicsclasse con una colonna sui metodi di supporto delle immagini, e quella colonna inizierà una piccola serie su altri argomenti relativi alle immagini e all'AWT, inclusi i produttori di immagini e i consumatori di immagini.

Vorrei ringraziare tutti voi che avete dedicato del tempo per scrivermi con i vostri commenti, idee e suggerimenti. Continua così.

Todd Sundsted scrive programmi da quando i computer sono diventati disponibili nei modelli desktop. Sebbene inizialmente interessato alla creazione di applicazioni a oggetti distribuiti in C ++, Todd è passato al linguaggio di programmazione Java quando Java è diventato la scelta più ovvia per quel genere di cose. Todd è coautore dell'API del linguaggio Java SuperBible, ora nelle librerie di tutto il mondo. Oltre a scrivere, Todd fornisce servizi di consulenza Internet e Web ad aziende negli Stati Uniti sudorientali.

Ulteriori informazioni su questo argomento

  • L' GraphicsAPI di classe :

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • L' FontAPI di classe :

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • L' FontMetricsAPI di classe :

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Utilizzando la Graphicsclasse:

    //www.javaworld.com/javaworld/jw-11-1996/jw-11-howto.html

  • L'API di internazionalizzazione:

    //www.javasoft.com/products/JDK/1.1/docs/guide/intl/index.html

  • Il tutorial Java di Mary Campione e Kathy Walrath:

    //www.javasoft.com/books/Series/Tutorial/index.html

Questa storia, "Disegnare il testo è facile con tre classi Java" è stata originariamente pubblicata da JavaWorld.