sabato 22 maggio 2010

Java: programmazione grafica (3)

In questo articolo vedremo come aggiungere al pannello delle informazioni scritte.
Quando desideriamo inviare all'utente un messaggio ci preoccupiamo del contenuto, del tipo di font e di colore, quindi delle coordinate da assegnare allo stesso.
Gli oggetti della classe Graphics dispongono di un set di metodi per fare questo genere di cose. Meglio usare la classe Graphics2D che offre al programmatore più metodi. Se non viene indicato esplicitamente nel corso del programma, quando cioè si sta descrivendo il pannello, verrà usato un font di default.
Per indicare il font da usare per la scrittura di un testo occorre specificare, allora, il nome del font e un suffisso che ne indica lo stile da applicare (ad esempio, bold, italic, etc...) Ma quali font sono installati sul mio computer? Il programma che segue è in grado di stampare a video una lista (lunga) di font noti al sistema operativo che si sta usando:

import java.awt.*;

public class ListFonts {
   public static void main(String args[]) {
      String[] fontNames=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
      for (int i=0;i<fontNames.length;i++)
         System.out.println(fontNames[i]);
   }
}


La lista di font che torna il programma sopra, come dicevo, è molto lunga proprio come i font che esistono. Alcuni font, poi, sono proprietari! Ciò significa che per il loro utilizzo bisogna pagare qualcuno. La libreria AWT definisce, allora, delle famiglie logiche di font che assomigliano a quelli originali: SansSerif, Serif, Monospaced, Dialog, DialogInput. Se vogliamo impostare un font va dato questo comando:

Font sansbold14=new Font("SansSerif",Font.BOLD,14);

L'ultimo parametro è la dimensione del font! Con setFont() comunichiamo all'oggetto della classe Graphics2D il font scelto e le sue caratteristiche:

g2.setFont(sansbold14);

Siamo pronti a scrivere! Il metodo drawString() richiede, oltre al messaggio (primo parametro), le coordinate da applicare al messaggio all'interno del pannello (i restanti due parametri).

g2.drawString(message,width/2,height/2);

Se vogliamo centrare il messaggio nel pannello bisogna lavorare non poco. Occorre ricavare il rettangolo che racchiude il messaggio e applicare allo stesso alcune considerazioni di tipo grafico (che riguardano i font). Trovate un esempio nel codice che segue:


class MyPanel extends JPanel {
   public void paintComponent(Graphics g) {
      Graphics2D g2=(Graphics2D)g;
      Font sansbold14=new Font("SansSerif",Font.BOLD,12);
      g2.setFont(sansbold14);
      String message="Luca";
      FontRenderContext context=g2.getFontRenderContext();
      Rectangle2D bounds=sansbold14.getStringBounds(message,context);
      double x=(this.getWidth()-bounds.getWidth())/2;
      double y=(this.getHeight()-bounds.getHeight())/2;
      g2.drawString(message,(int)x,(int)(y));
   }
   static final long serialVersionUID=-1L;
   static final float margin=10;
}

Nessun commento:

Posta un commento