PintaLlop - Programa de dibujo

Llop Site Home > JAVA > PintaLlop > Clases complementarias

Clases complementarias:

Clase PanelPropiedades

package pintallop;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/** Título: PintaLlop
    Descripción: Prácticas capítulo 11, ejercicio 3
    Copyright: Copyright (c) 2005
    Empresa: Casa_Llop
    @author Albert_Lobo
    @version 1.0 */

/** Clase que extiende 'JPanel'. Muestra, y permite modificar, las propiedades de la herramienta en uso. */
public class PanelPropiedades extends JPanel
{
  // La herramienta cuyas propiedades muestra el panel.
  private Herramienta herramientaEnUso;

  // Etiqueta para el icono correspondiente a la herramienta.
  private JLabel iconoHerramienta;
  // Etiqueta y 'JComboBox' para tratar el grosor del borde del trazo/figura.
  private JLabel etiquetaGrueso;
  private JComboBox listaGrueso;
  // Etiquetas y botones que permitirán modificar el color del borde y el fondo de una figura.
  private JLabel etiquetaColorBorde;
  private JButton botonColorBorde;
  private JLabel etiquetaColorFondo;
  private JButton botonColorFondo;

  // Estos componentes son propios de la herramienta de texto.
  // Una lista para seleccionar la fuente.
  private JComboBox listaFuentes;
  // Una etiqueta y un 'JComboBox' para ajustar el tamaño de la fuente.
  private JLabel etiquetaTamano;
  private JComboBox listaTamano;
  // Una serie de botones que permitirán escribir texto normal, en negrita, y cursiva.
  private ButtonGroup grupoBotones;
  private JButton botonTxtPlano;
  private JButton botonTxtNegrita;
  private JButton botonTxtCursiva;

  // Panel para seleccionar un color.
  private JColorChooser paleta;

  /** Constructor. Solamente necesita conocer qué herramienta se está actualizando.
      @param nuevaHerramientaEnUso Herramienta  La herramienta actualmente en uso. */
  public PanelPropiedades (Herramienta nuevaHerramientaEnUso)
  {
    // Construir un 'JPanel' con un 'BorderLayout'.
    super ();
    setLayout (new GridBagLayout ());
    // Definir la herramienta en uso.
    herramientaEnUso = nuevaHerramientaEnUso;
    // 'JColorChooser' para seleccionar colores.
    paleta = new JColorChooser ();

    // Inicializar todos los componentes.
    inicializaComponetes ();
    // Añadir los componentes adecuados al panel.
    if (herramientaEnUso.getTipo () != ColeccionHerramientas.TEXTO)
      anadePropiedades ();
    else
      anadePropiedadesTexto ();
    // Refrescar los componentes, por si ha habido cambios.
    refrescaComponentes ();
  }

  /** Inicializa los componentes que puede tener el panel. */
  private void inicializaComponetes ()
  {
    // Etiqueta para el icono de la herramienta.
    iconoHerramienta = new JLabel ();

    // Con estos componentes se puede manipular el grosor del trazo.
    // Nótese que, para que la función 'fillPolygon ()' pinte algo siempre, el grosor mínimo debe ser 2.
    etiquetaGrueso = new JLabel ("Grosor Trazo: ");
    String contenidoLista [] = new String [127];
    for (byte i = 0; i < 127; i++)
      contenidoLista [i] = String.valueOf (i + 2);
    listaGrueso = new JComboBox (contenidoLista);
    listaGrueso.setAction (new AbstractAction ()
    {
      public void actionPerformed (ActionEvent evento)
      {
        herramientaEnUso.setGrueso ((byte) (listaGrueso.getSelectedIndex () + 1));
      }
    });

    // Con estos componentes se puede manipular el color del trazo, y el del texto.
    etiquetaColorBorde = new JLabel ("Color Borde: ");
    botonColorBorde = new JButton ();
    botonColorBorde.setAction (new AbstractAction ("", PintaLlop.getIcono ("color.gif"))
    {
      public void actionPerformed (ActionEvent evento)
      {
        Color nuevoColorBorde = paleta.showDialog
            (null, "Elija el color para el borde", botonColorBorde.getBackground ());
        herramientaEnUso.setColorBorde (nuevoColorBorde);
        botonColorBorde.setBackground (nuevoColorBorde);
      }
    });

    // Con estos componentes se puede manipular el color del relleno (sólo en 'ovalo y rectángulo).
    etiquetaColorFondo = new JLabel ("Color Fondo: ");
    botonColorFondo = new JButton ();
    botonColorFondo.setAction (new AbstractAction ("", PintaLlop.getIcono ("color.gif"))
    {
      public void actionPerformed (ActionEvent evento)
      {
        Color nuevoColorRelleno = paleta.showDialog
            (null, "Elija el color para el relleno", botonColorBorde.getBackground ());
        herramientaEnUso.setColorRelleno (nuevoColorRelleno);
        botonColorFondo.setBackground (nuevoColorRelleno);
      }
    });

    // Los siguientes componetes son sólo para la herramienta de texto.
    // Con estos componentes se puede elegir la fuente del texto.
    // Podemos obtener las fuentes para Java en una sola línea.
    String fuentes [] = GraphicsEnvironment.getLocalGraphicsEnvironment ().getAvailableFontFamilyNames ();
    listaFuentes = new JComboBox (fuentes);
    listaFuentes.setAction (new AbstractAction ()
    {
      public void actionPerformed (ActionEvent evento)
      {
        herramientaEnUso.setNombreFuente ((String) listaFuentes.getSelectedItem ());
      }
    });
    // Con estos componentes se puede elegir el tamaño del texto.
    etiquetaTamano = new JLabel ("Tamaño: ");
    listaTamano = new JComboBox (contenidoLista);
    listaTamano.setAction (new AbstractAction ()
    {
      public void actionPerformed (ActionEvent evento)
      {
        herramientaEnUso.setTamano (listaTamano.getSelectedIndex () + 1);
      }
    });

    // Con los 3 siguientes botones, se puede poner el texto normal, en negrita, y en cursiva.
    botonTxtPlano = new JButton ();
    botonTxtPlano.setAction (new AbstractAction ("", PintaLlop.getIcono ("plano.gif"))
    {
      public void actionPerformed (ActionEvent evento)
      {
        herramientaEnUso.setEstilo (Font.PLAIN);
      }
    });
    botonTxtNegrita = new JButton ();
    botonTxtNegrita.setAction (new AbstractAction ("", PintaLlop.getIcono ("negrita.gif"))
    {
      public void actionPerformed (ActionEvent evento)
      {
        herramientaEnUso.setEstilo (Font.BOLD);
      }
    });
    botonTxtCursiva = new JButton ();
    botonTxtCursiva.setAction (new AbstractAction ("", PintaLlop.getIcono ("cursiva.gif"))
    {
      public void actionPerformed (ActionEvent evento)
      {
        herramientaEnUso.setEstilo (Font.ITALIC);
      }
    });

    // Añadimos los botones a un 'ButtonGroup' para que sólo uno de ellos esté seleccionado a la vez.
    grupoBotones = new ButtonGroup ();
    grupoBotones.add (botonTxtPlano);
    grupoBotones.add (botonTxtNegrita);
    grupoBotones.add (botonTxtCursiva);
  }

  /** Añade al panel los componentes propios de la herramientas:
        - lápiz, goma, línea, rectángulo, y óvalo. */
  private void anadePropiedades ()
  {
    GridBagConstraints restricciones = new GridBagConstraints ();
    restricciones.fill = GridBagConstraints.BOTH;
    restricciones.gridheight = GridBagConstraints.REMAINDER;
    add (iconoHerramienta, restricciones);
    add (etiquetaGrueso, restricciones);
    add (listaGrueso, restricciones);
    add (etiquetaColorBorde, restricciones);
    add (botonColorBorde, restricciones);
    // Con el rectángulo y el óvalo vemos un componente más,
    // que nos permite ajustar el color de relleno de la figura.
    if ((herramientaEnUso.getTipo () == ColeccionHerramientas.RECTANGULO)
        || (herramientaEnUso.getTipo () == ColeccionHerramientas.OVALO))
    {
      add (etiquetaColorFondo, restricciones);
      add (botonColorFondo, restricciones);
    }
  }

  /** Añade al panel los componentes propios de la herramienta de texto. */
  private void anadePropiedadesTexto ()
  {
    GridBagConstraints restricciones = new GridBagConstraints ();
    restricciones.fill = GridBagConstraints.BOTH;
    restricciones.gridheight = GridBagConstraints.REMAINDER;
    restricciones.weightx = 0;
    add (iconoHerramienta, restricciones);
    restricciones.weightx = 1;
    add (botonColorBorde, restricciones);
    add (listaFuentes, restricciones);
    restricciones.weightx = 0;
    add (etiquetaTamano, restricciones);
    add (listaTamano, restricciones);
    restricciones.weightx = 1;
    add (botonTxtPlano, restricciones);
    add (botonTxtNegrita, restricciones);
    add (botonTxtCursiva, restricciones);
  }

  /** Define la herramienta en uso. Lógicamente, también ajusta los componentes a las propiedades.
      @param nuevaHerramientaEnUso Herramienta  La nueva herramienta en uso. */
  public void setHerramientaEnUso (Herramienta nuevaHerramientaEnUso)
  {
    // Si la herramienta es la misma que había, no hay por qué seguir.
    if (herramientaEnUso.getTipo () == nuevaHerramientaEnUso.getTipo ())
      return;

    // Definir la nueva herramienta en uso; quitar todos los componentes; añadir sólo los
    // adecuados; y validar el panel.
    herramientaEnUso = nuevaHerramientaEnUso;
    removeAll ();
    if (nuevaHerramientaEnUso.getTipo () == ColeccionHerramientas.TEXTO)
      anadePropiedadesTexto ();
    else
      anadePropiedades ();
    validate ();

    // Ajustar las nuevas propiedades.
    refrescaComponentes ();
  }

  /** Actualiza los componentes para que reflejen las propiedades de la herramienta en uso. */
  public void refrescaComponentes ()
  {
    iconoHerramienta.setIcon (herramientaEnUso.getIcono ());
    listaGrueso.setSelectedIndex (herramientaEnUso.getGrueso () - 1);
    botonColorBorde.setBackground (herramientaEnUso.getColorBorde ());
    botonColorFondo.setBackground (herramientaEnUso.getColorRelleno ());
    listaFuentes.setSelectedItem (herramientaEnUso.getNombreFuente ());
    listaTamano.setSelectedIndex (herramientaEnUso.getTamano () - 1);
    // Averiguar el botón seleccionado del 'ButtonGroup'.
    ButtonModel modeloBotonSeleccionado = null;
    switch (herramientaEnUso.getEstilo ())
    {
      case Font.PLAIN:
        modeloBotonSeleccionado = botonTxtPlano.getModel ();
        break;
      case Font.BOLD:
        modeloBotonSeleccionado = botonTxtNegrita.getModel ();
        break;
      case Font.ITALIC:
        modeloBotonSeleccionado = botonTxtCursiva.getModel ();
    }
    grupoBotones.setSelected (modeloBotonSeleccionado, true);

    // Repinta el panel.
    repaint ();
  }
}



Clase SelectorImagenes

package pintallop;

import javax.swing.*;

/** Esta clase es básicamente un 'JFileChooser' personalizado:
    - Tiene un filtro -'FiltroImagenes'- que restringe los archivos disponibles a los '.gif',
      '.jpeg', y '.png'.
    - y puede poner nombre al botón de aceptar con el String que se pasa como argumento. */
public class SelectorImagenes extends JFileChooser
{
  /** Constructor.
      @param botonAprobar String  Cadena para el botón de aceptar del 'JFileChooser'. */
  public SelectorImagenes (String botonAprobar)
  {
    super ();

    addChoosableFileFilter (new FiltroImagenes (new String [] {".gif", ".jpeg", ".jpg", ".png"}));
    setApproveButtonText (botonAprobar);
  }
}



Clase FiltroImagenes

package pintallop;

import java.io.*;

/** La clase 'FileFilter' se encuentra tanto en 'javax.swing.filechooser', como en 'java.io'.
    Casualmente, hay que importar ambas bibliotecas. 'FiltroArchivos' se extiende de
    'javax.swing.filechooser.FileFilter', así que en lugar de importar las 2 bibliotecas
    sólo se importa 'java.io', y la otra se indica junto a 'extends'.
    Esta clase está pensada para limitar los archivos visibles en los 'JFileChooser'.
    Se sobrecargan los dos únicos métodos de la superclase. */
public class FiltroImagenes extends javax.swing.filechooser.FileFilter
{
  // Array para almacenar las extensiones de archivo permitidas por el filtro.
  private String extensiones [];

  /** Costructor. Define las extensiones aceptadas por el filtro.
      @param extensionesAceptadas String []  Array con las extensiones aceptadas por el filtro. */
  public FiltroImagenes (String extensionesAceptadas [])
  {
    extensiones = extensionesAceptadas;
  }

  /** Este método sirve para decidir los archivos disponibles en la ventanita 'JFileChooser';
      se le pasa como argumento un 'File' en el directorio de turno, y según
      el valor de retorno, el archivo se mostrará o no.
      @param archivo File  Archivo cuya extensión vamos a evaluar.
      @return boolean      'true' si la extensión del archivo es de las aceptadas; 'false' si no. */
  public boolean accept (File archivo)
  {
    String nombre = archivo.getName ().toLowerCase ();

    if (archivo.isDirectory ())
      return true;

    for (int i = 0; i < extensiones.length; i++)
      if (nombre.endsWith (extensiones [i]))
        return true;

    return false;
  }

  /** Este método establece el texto en el menú desplegable 'Tipos de archivo' para este filtro.
      @return String  Descripción de este filtro para mostrar en el 'JFileChooser'. */
  public String getDescription ()
  {
    String retorno = "Archivos de imagen: " + extensiones [0];

    for (int i = 1; i < extensiones.length; i++)
      retorno += ", " + extensiones [i];

    return retorno;
  }
}

¿Comentarios, sugerencias?: llopsite.at.yahoo.es | © 2005-07 Albert Lobo

Última actualización: 18-Feb-2007

Hosted by www.Geocities.ws

1