• No se han encontrado resultados

Es posible mostrar una cadena de texto con cualquier tipo de letra disponible en el sistema, en cualquier tamaño y en el estilo que se seleccione. Para determinar las fuentes que están disponibles en el sistema es necesario llamar el método GrpahicsEnvironment.getAvailableFontFamilyNames. Este método retorna un arreglo de cadenas que contiene los nombres de las familias de las fuentes disponibles, cualquiera de estas cadenas, además del tamaño y el estilo, pueden ser utilizados como argumentos para crear un nuevo objeto Font.

Figura 65 Ejemplo de dibujo de fuentes

El siguiente ejemplo, muestra

una aplicación donde es

posible seleccionar el tipo de fuente, tamaño y estilo a partir de 3 objetos combo y observar

las modificaciones en la

cadena dibujada. El ejemplo es tomado del Tutorial de Java 2D de Sun Microsystems. La ejecución del programa genera una pantalla como la que se muestra al lado.

Para construir el ejemplo, es necesario utilizar el siguiente código que permite obtener los datos de las fuentes instaladas en el sistema y guardarlos en un objeto Vector, que posteriormente puede pasarse a un combo que despliegue los nombres de las fuentes:

GraphicsEnvironment gEnv = GraphicsEnvironment.getLocalGraphicsEnvironment(); String envcmbFuente[] = gEnv.getAvailableFontFamilyNames();

Vector vector = new Vector();

for ( int i = 1; i < envcmbFuente.length; i++ ) { vector.addElement(envcmbFuente[i]); }

cmbFuente = new JComboBox( vector ); cmbFuente.setMaximumRowCount( 9 ); cmbFuente.addItemListener(this); nuevafuente = envcmbFuente[0]; pnlLetra.add(cmbFuente);

A continuación se crea un objeto Font con un estilo Font.PLAIN y un tamaño de 10. Los otros estilos disponibles son ITALIC, BOLD y BOLD+ITALIC.

Font thisFont; ...

thisFont = new Font("Arial", Font.PLAIN, 10);

Posteriormente es posible crear un nuevo objeto Font a partir de un nombre de fuente, estilo y tamaño, que pueden seleccionarse de distintos combo. Al seleccionarse el tamaño el valor de item es de tipo cadena, por lo que se debe convertir a entero para poder crear la nueva fuente.

public void cambiarFuente(String nf, int nest, String ntam){ Integer nuevoTam = new Integer(ntam);

int tam = nuevoTam.intValue(); thisFont = new Font(nf, nest, tam); repaint();

} `

Para controlar la fuente que se utiliza para dibujar el texto, es necesario enviar los atributos de la fuente al contexto Graphics2D antes de renderizar. Los atributos de la fuente se envían pasando un objeto Font al método setFont. En este ejemplo, los atributos son envidos al construir el nuevo objeto Font y la cadena se dibuja en el centro del componente usando esta fuente. Cada vez que se modifiquen los atributos, se construye un nuevo objeto Font y se envía al contexto Graphics 2D en el metodo Paint() para que sean redibujados. El método getFontMetrics permite medir la longitud en píxeles de la cadena considerando los nuevos atributos, de manera que siempre se dibuje en el centro del componente.

g2.setFont(thisFont);

String cadena = "Seleccione una fuente, tamaño y estilo para modificarme"; FontMetrics medida = g2.getFontMetrics();

int ancho = medida.stringWidth( cadena ); int alto = medida.getHeight();

//Dibuja la cadena en el centro del panel correspondiente g2.drawString( cadena, w/2-ancho/2, h/2-alto/2 ); }

El código completo del ejemplo, comentado se muestra a continuación: /*

* Ejemplo de selección de fuentes. Construido para el Tutorial * de Java2D de Sun Microsystems.

*/ import java.lang.Integer; import java.awt.*; import java.awt.font.*; import java.awt.geom.*; import java.awt.event.*; import javax.swing.*; import java.util.Vector;

public class FontSelection extends JApplet implements ItemListener { JLabel lblFuente, lblTamano, lblEstilo;

pnlLetra fontC;

JComboBox cmbFuente, cmbTamano, cmbEstilo; int i = 0;

String nuevafuente = "Fuente sin seleccionar"; int nuevoestilo = 0;

String nuevotam = "10";

public void init() {

getContentPane().setLayout( new BorderLayout() );

JPanel pnlSuperior = new JPanel(); JPanel pnlLetra = new JPanel(); JPanel pnlTamano = new JPanel(); JPanel pnlEstilo = new JPanel();

JPanel pnlEstiloTamano = new JPanel();

//Se asignan las distribuciones para cada panel pnlSuperior.setLayout( new BorderLayout() ); pnlLetra.setLayout( new GridLayout( 2, 1 ) ); pnlTamano.setLayout( new GridLayout( 2, 1 ) ); pnlEstilo.setLayout( new GridLayout( 2, 1 ) ); pnlEstiloTamano.setLayout( new BorderLayout() );

//Incluye cada panel dentro de los correspondientes para visualizar mejor //la distribución de la aplicación

pnlSuperior.add( BorderLayout.WEST, pnlLetra );

pnlEstiloTamano.add( BorderLayout.WEST, pnlTamano ); pnlEstiloTamano.add( BorderLayout.CENTER, pnlEstilo ); pnlSuperior.add( BorderLayout.CENTER, pnlEstiloTamano );

getContentPane().add( BorderLayout.NORTH, pnlSuperior );

//Asigna características a la etiqueta de texto Fuentes lblFuente = new JLabel();

lblFuente.setText("Fuentes");

Font newFont = getFont().deriveFont(1); lblFuente.setFont(newFont);

lblFuente.setHorizontalAlignment(JLabel.CENTER); pnlLetra.add(lblFuente);

//Asigna características a la etiqueta de texto Tamaño lblTamano = new JLabel();

lblTamano.setText("Tamaño"); lblTamano.setFont(newFont);

lblTamano.setHorizontalAlignment(JLabel.CENTER); pnlTamano.add(lblTamano);

//Asigna características a la etiqueta de texto Estilo lblEstilo = new JLabel();

lblEstilo.setText("Estilo"); lblEstilo.setFont(newFont);

lblEstilo.setHorizontalAlignment(JLabel.CENTER); pnlEstilo.add(lblEstilo);

/*Se obtienen las fuentes disponibles en el contexto gráfico

*se asignan al objeto vector que posteriomente es enviado al combo

*de Fuentes. Se asigna un máximo de items para mostrar en el combo de 9 fila *y se predetermina como fuente inicial, la primera fuente ubicada (indice 0). *Finalmente se agrega el combo al panel correspondiente.

*/

GraphicsEnvironment gEnv = GraphicsEnvironment.getLocalGraphicsEnvironment(); String envcmbFuente[] = gEnv.getAvailableFontFamilyNames();

Vector vector = new Vector();

for ( int i = 1; i < envcmbFuente.length; i++ ) { vector.addElement(envcmbFuente[i]); }

cmbFuente = new JComboBox( vector ); cmbFuente.setMaximumRowCount( 9 ); cmbFuente.addItemListener(this); nuevafuente = envcmbFuente[0]; pnlLetra.add(cmbFuente);

/*Se asignan los valores para el combo de tamaño, los posibles tamaños serán 10, *12,14,16,18. Se define como máximo número de filas a mostrar 9. Se agrega el combo

*/

cmbTamano = new JComboBox( new Object[]{ "10", "12", "14", "16", "18"} ); cmbTamano.setMaximumRowCount( 9 );

cmbTamano.addItemListener(this); pnlTamano.add(cmbTamano);

/*Se arma el combo de estilo a partir de los estilos predeterminados.se siguen los mismo *pasos que para los combos anteriores y finalmente se incluye el combo en el panel *correspondiente.

*/

cmbEstilo = new JComboBox( new Object[]{ "PLAIN",

"BOLD", "ITALIC",

"BOLD & ITALIC"} );

cmbEstilo.setMaximumRowCount( 9 ); cmbEstilo.addItemListener(this);

cmbTamano.setMaximumRowCount( 9 ); pnlEstilo.add(cmbEstilo);

/*Se especifican las caracteristicas del Panel que va a contener el texto. */

fontC = new pnlLetra();

fontC.setBackground(Color.white);

getContentPane().add( BorderLayout.CENTER, fontC); }

/* El siguiente método detecta cuando se ha realizado la modificación de item * en alguno de los combos.

*/

public void itemStateChanged(ItemEvent e) { if ( e.getStateChange() != ItemEvent.SELECTED ) { return;

}

//Compara con cada uno de los combos posibles if ( combomodif == cmbFuente ) {

nuevafuente = (String)cmbFuente.getSelectedItem(); } else if ( combomodif == cmbEstilo ) {

i = cmbEstilo.getSelectedIndex(); nuevoestilo = i;

} else {

nuevotam = (String)cmbTamano.getSelectedItem(); }

//Cambia la fuente del contexto, de acuerdo con los nuevos atributos seleccionados en los combo fontC.cambiarFuente(nuevafuente, nuevoestilo, nuevotam);

}

public static void main(String s[]) {

JFrame f = new JFrame("Ejemplo de renderizado de texto"); f.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {System.exit(0);} });

JApplet Seleccion = new FontSelection();

f.getContentPane().add(Seleccion, BorderLayout.CENTER); Seleccion.init(); f.setSize(new Dimension(550,250)); f.setVisible(true); } }

class pnlLetra extends JPanel {

Font thisFont;

public pnlLetra(){

thisFont = new Font("Arial", Font.PLAIN, 10); }

// Este método es el que modifica la fuente de acuerdo con los nuevos parámetros public void cambiarFuente(String nf, int nest, String ntam){

Integer nuevoTam = new Integer(ntam); int tam = nuevoTam.intValue();

thisFont = new Font(nf, nest, tam); repaint();

}

public void paintComponent (Graphics g) { super.paintComponent( g ); Graphics2D g2 = (Graphics2D) g; int w = getWidth(); int h = getHeight(); g2.setColor(Color.darkGray); g2.setFont(thisFont);

String cadena = "Seleccione una fuente, tamaño y estilo para modificarme"; FontMetrics medida = g2.getFontMetrics();

int ancho = medida.stringWidth( cadena ); int alto = medida.getHeight();

//Dibuja la cadena en el centro del panel correspondiente g2.drawString( cadena, w/2-ancho/2, h/2-alto/2 );

} }

Se recomienda revisar el ejemplo y plantear una solución para cuando el texto no cabe en una línea y se requiere separarlo, como en el caso de un párrafo.