TLlop - Clon del Tetris

Llop Site Home > JAVA > TLlop > Menú de inicio

Menú de Inicio:

Clase PanelMenuInicio

package ejercicio_5;

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

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

/** Contenedor con una serie de paneles para retocar algunos de los parámetros del juego. */
public class PanelMenuInicio extends JTabbedPane
{
  // Estos valores finales representan las pestañas en el 'JTabbedPane'.
  /** Constante que representa el panel 'juego'. */
  public static final byte JUEGO = 0;
  /** Constante que representa el panel 'opciones'. */
  public static final byte OPCIONES = 1;
  /** Constante que representa el panel 'controles'. */
  public static final byte CONTROLES = 2;
  /** Constante que representa el panel 'piezasDisponibles'. */
  public static final byte PIEZAS_DISPONIBLES = 3;
  /** Constante que representa el panel 'top10'. */
  public static final byte TOP10 = 4;
  /** Constante que representa el panel 'información'. */
  public static final byte INFORMACION = 5;

  // Estos 5 paneles son los que contiene el 'JTabbedPane'.
  private JPanel juego;
  private JPanel opciones;
  private JPanel controles;
  private JPanel piezasDisponibles;
  private JPanel top10;
  private JPanel informacion;

  // En 'opcionesJuego' hay los valores para inicializar algunos componentes de esta clase.
  private OpcionesJuego opcionesJuego;

  // Sub-paneles para el panel 'opciones'.
  private TiraOpciones panelNivelInicial;
  private TiraOpciones panelLineasCambioNivel;
  private TiraOpciones panelLineasIniciales;
  private TiraOpciones panelCuadradosAncho;
  private TiraOpciones panelCuadradosAlto;
  private TiraOpciones panelDisenoPieza;
  private TiraOpciones panelSeVeSiguientePieza;
  private TiraOpciones panelGravedadReal;
  private TiraVistaPrevia vistaPreviaFondoPanel;
  private TiraVistaPrevia vistaPreviaFondoCuadricula;

  // Iconos para los botones en los anteriores paneles.
  private ImageIcon iconoBotonIzquierda;
  private ImageIcon iconoBotonDerecha;

  // Array de cajas de texto para los controles.
  private Texto textoControles [];

  // Etiqueta para el 'top10'.
  private JLabel etiquetaClasificacion;

  // Array para los nombres del diseño de las piezas, y un valor que se utilizará como índice.
  private String disenosDisponibles [];
  private byte disenoPieza;

  // Array con los nombres de las imágenes de fondo de ventana, y un valor índice.
  private String fondosPanelDisponibles [];
  private byte fondoPanel;

  // Array con los nombres de las imágenes de fondo del panel de juego, y un valor índice.
  private String fondosCuadriculaDisponibles [];
  private byte fondoCuadricula;

  // Clase para obtener la descripción de las teclas.
  private VKKeyCodeAString con;

  /** Constructor. Inicializa todos los componentes gráficos con la información que obtiene de
      un objeto 'Opciones Juego'.
      @param op OpcionesJuego    : Objeto con todos los parámetros del juego. */
  public PanelMenuInicio (OpcionesJuego op)
  {
    super ();
    /** El fondo, blanco; y las letras, azules. */
    setBackground (Color.white);
    setForeground (Color.blue);
    setFont (new Font ("Showcard Gothic", Font.BOLD, 16));

    /** Las variables, inicializadas. */
    opcionesJuego = op;
    con = new VKKeyCodeAString ();
    textoControles = new Texto [op.getNumeroControles ()];

    /** El diseño de las piezas, y  las imágenes para la ventana y el panel de juego, inicializadas. */
    disenosDisponibles = Pieza.getDisenosDisponibles ();
    for (disenoPieza = 0; disenoPieza < 5; disenoPieza++)
      if (disenosDisponibles [disenoPieza].equals (opcionesJuego.getDiseno ()))
        break;
    fondosPanelDisponibles = new String [5];
    fondosPanelDisponibles = PanelJuego.getFondosDisponibles ();
    for (fondoPanel = 0; fondoPanel < 4; fondoPanel++)
      if (fondosPanelDisponibles [fondoPanel].equals (opcionesJuego.getFondoPanel ()))
        break;
    fondosCuadriculaDisponibles = PanelCuadricula.getFondosDisponibles ();
    for (fondoCuadricula = 0; fondoCuadricula < 4; fondoCuadricula++)
      if (fondosCuadriculaDisponibles [fondoCuadricula].equals (opcionesJuego.getFondoCuadricula ()))
        break;

    iconoBotonIzquierda = Tetris.getImagen ("izquierda.gif", "Botón izquierda");
    iconoBotonDerecha = Tetris.getImagen ("derecha.gif", "Botón derecha");

    inicializaPaneles ();
  }

  /** Esta función inicializa los paneles de la clase con las variables del objeto 'OpcionesJuego'. */
  public void inicializaPaneles ()
  {
    /** Panel 'juego': Hace las veces de presentación. */
    juego = new JPanel ();
    juego.setBackground (Color.white);
    juego.setLayout (new BorderLayout ());
    juego.add (new JLabel (Tetris.getImagen ("inicio.png", "Carátula")), BorderLayout.CENTER);
    addTab ("Juego", juego);

    /** Panel 'opciones': En éste se pueden ajustar algunas variables del juego.
        Descripción del patrón del panel: - Se nombra la etiqueta del panel, y
                                          - se pone la acción para los 2 botones.
        Descripción del patrón para las acciones: - la 'AccionIzquierda' disminuye el valor de la
                                                    'etiquetaVariable', lo cambia si es de 'sí-o-no',
                                                    o pasa a la image anterior; también modifica la
                                                    variable en 'opcionesJuego'. La 'AcciónDerecha' hace lo
                                                    mismo sólo que aumentando el valor de la variable. */
    panelNivelInicial = new TiraOpciones ("Velocidad de caida inicial de las piezas");
    panelNivelInicial.setEtiquetaPauta ("Nivel Inicial: ");
    panelNivelInicial.setAccionIzquierda (new AbstractAction ("", iconoBotonIzquierda)
    {
      public void actionPerformed (ActionEvent e)
      {
        byte nuevoNivel = (byte) (opcionesJuego.getNivelInicial () - 1);
        if (nuevoNivel < 1)
          nuevoNivel = 20;
        opcionesJuego.setNivelInicial (nuevoNivel);
        panelNivelInicial.setEtiquetaVariable (nuevoNivel);
      }
    });
    panelNivelInicial.setAccionDerecha (new AbstractAction ("", iconoBotonDerecha)
    {
      public void actionPerformed (ActionEvent e)
      {
        byte nuevoNivel = (byte) (opcionesJuego.getNivelInicial () + 1);
        if (nuevoNivel > 20)
          nuevoNivel = 1;
        opcionesJuego.setNivelInicial (nuevoNivel);
        panelNivelInicial.setEtiquetaVariable (nuevoNivel);
      }
    });
    panelLineasCambioNivel = new TiraOpciones ("Líneas a completar para subir nivel");
    panelLineasCambioNivel.setEtiquetaPauta ("Líneas Hasta Subir Nivel: ");
    panelLineasCambioNivel.setAccionIzquierda (new AbstractAction ("", iconoBotonIzquierda)
    {
      public void actionPerformed (ActionEvent e)
      {
        byte nuevoLineasCambioNivel = (byte) (opcionesJuego.getLineasCambioNivel () - 1);
        if (nuevoLineasCambioNivel < 5)
          nuevoLineasCambioNivel = 25;
        opcionesJuego.setLineasCambioNivel (nuevoLineasCambioNivel);
        panelLineasCambioNivel.setEtiquetaVariable (nuevoLineasCambioNivel);
      }
    });
    panelLineasCambioNivel.setAccionDerecha (new AbstractAction ("", iconoBotonDerecha)
    {
      public void actionPerformed (ActionEvent e)
      {
        byte nuevoLineasCambioNivel = (byte) (opcionesJuego.getLineasCambioNivel () + 1);
        if (nuevoLineasCambioNivel > 25)
          nuevoLineasCambioNivel = 5;
        opcionesJuego.setLineasCambioNivel (nuevoLineasCambioNivel);
        panelLineasCambioNivel.setEtiquetaVariable (nuevoLineasCambioNivel);
      }
    });
    panelLineasIniciales = new TiraOpciones ("Líneas parcialmente rellenas al inicio de la partida");
    panelLineasIniciales.setEtiquetaPauta ("Lineas Iniciales: ");
    panelLineasIniciales.setAccionIzquierda (new AbstractAction ("", iconoBotonIzquierda)
    {
      public void actionPerformed (ActionEvent e)
      {
        byte nuevoLineasIniciales = (byte) (opcionesJuego.getLineasRellenasInicio () - 1);
        if (nuevoLineasIniciales < 0)
          nuevoLineasIniciales = 10;
        opcionesJuego.setLineasRellenasInicio (nuevoLineasIniciales);
        panelLineasIniciales.setEtiquetaVariable (nuevoLineasIniciales);
      }
    });
    panelLineasIniciales.setAccionDerecha (new AbstractAction ("", iconoBotonDerecha)
    {
      public void actionPerformed (ActionEvent e)
      {
        byte nuevoLineasIniciales = (byte) (opcionesJuego.getLineasRellenasInicio () + 1);
        if (nuevoLineasIniciales > 10)
          nuevoLineasIniciales = 0;
        opcionesJuego.setLineasRellenasInicio (nuevoLineasIniciales);
        panelLineasIniciales.setEtiquetaVariable (nuevoLineasIniciales);
      }
    });
    panelCuadradosAncho = new TiraOpciones ("Anchura en cuadradillos del panel de juego");
    panelCuadradosAncho.setEtiquetaPauta ("Cuadradillos a lo ancho: ");
    panelCuadradosAncho.setAccionIzquierda (new AbstractAction ("", iconoBotonIzquierda)
    {
      public void actionPerformed (ActionEvent e)
      {
        byte nuevaAnchura = (byte) (opcionesJuego.getCuadradosX () - 1);
        if (nuevaAnchura < 8)
          nuevaAnchura = 16;
        opcionesJuego.setCuadradosX (nuevaAnchura);
        panelCuadradosAncho.setEtiquetaVariable (nuevaAnchura);
      }
    });
    panelCuadradosAncho.setAccionDerecha (new AbstractAction ("", iconoBotonDerecha)
    {
      public void actionPerformed (ActionEvent e)
      {
        byte nuevaAnchura = (byte) (opcionesJuego.getCuadradosX () + 1);
        if (nuevaAnchura > 16)
          nuevaAnchura = 8;
        opcionesJuego.setCuadradosX (nuevaAnchura);
        panelCuadradosAncho.setEtiquetaVariable (nuevaAnchura);
      }
    });
    panelCuadradosAlto = new TiraOpciones ("Altura en cuadradillos del panel de juego");
    panelCuadradosAlto.setEtiquetaPauta ("Cuadradillos a lo alto: ");
    panelCuadradosAlto.setAccionIzquierda (new AbstractAction ("", iconoBotonIzquierda)
    {
      public void actionPerformed (ActionEvent e)
      {
        byte nuevoAlto = (byte) (opcionesJuego.getCuadradosY () - 1);
        if (nuevoAlto < 15)
          nuevoAlto = 27;
        opcionesJuego.setCuadradosY (nuevoAlto);
        panelCuadradosAlto.setEtiquetaVariable ((byte) (nuevoAlto - 3));
      }
    });
    panelCuadradosAlto.setAccionDerecha (new AbstractAction ("", iconoBotonDerecha)
    {
      public void actionPerformed (ActionEvent e)
      {
        byte nuevoAlto = (byte) (opcionesJuego.getCuadradosY () + 1);
        if (nuevoAlto > 27)
          nuevoAlto = 15;
        opcionesJuego.setCuadradosY (nuevoAlto);
        panelCuadradosAlto.setEtiquetaVariable ((byte) (nuevoAlto - 3));
      }
    });
    panelDisenoPieza = new TiraOpciones ("Diseño de los cuadradillos individuales que forman las piezas");
    panelDisenoPieza.setEtiquetaPauta ("Diseño Piezas: ");
    panelDisenoPieza.setAccionIzquierda (new AbstractAction ("", iconoBotonIzquierda)
    {
      public void actionPerformed (ActionEvent e)
      {
        if (disenoPieza - 1 < 0)
          disenoPieza = 5;
        opcionesJuego.setDiseno (disenosDisponibles [--disenoPieza]);
        panelDisenoPieza.setEtiquetaVariable (Tetris.getImagen (disenosDisponibles [disenoPieza]
                                             + "Blanco.gif", "Diseño " + disenosDisponibles [disenoPieza]),
                                             disenosDisponibles [disenoPieza]);
      }
    });
    panelDisenoPieza.setAccionDerecha (new AbstractAction ("", iconoBotonDerecha)
    {
      public void actionPerformed (ActionEvent e)
      {
        if (disenoPieza + 1 > 4)
          disenoPieza = -1;
        opcionesJuego.setDiseno (disenosDisponibles [++disenoPieza]);
        panelDisenoPieza.setEtiquetaVariable (Tetris.getImagen (disenosDisponibles [disenoPieza]
                                             + "Blanco.gif", "Diseño " + disenosDisponibles [disenoPieza]),
                                             disenosDisponibles [disenoPieza]);
      }
    });
    panelSeVeSiguientePieza = new TiraOpciones ("Active o desactive el panel con la siguiente pieza");
    panelSeVeSiguientePieza.setEtiquetaPauta ("Ver Siguiente Pieza: ");
    panelSeVeSiguientePieza.setAccionIzquierda (new AbstractAction ("", iconoBotonIzquierda)
    {
      public void actionPerformed (ActionEvent e)
      {
        boolean siONo = !opcionesJuego.getSeVeSiguientePieza ();
        opcionesJuego.setSeVeSiguientePieza (siONo);
        panelSeVeSiguientePieza.setEtiquetaVariable (siONo ? "Sí" : "No");
      }
    });
    panelSeVeSiguientePieza.setAccionDerecha (new AbstractAction ("", iconoBotonDerecha)
    {
      public void actionPerformed (ActionEvent e)
      {
        boolean siONo = !opcionesJuego.getSeVeSiguientePieza ();
        opcionesJuego.setSeVeSiguientePieza (siONo);
        panelSeVeSiguientePieza.setEtiquetaVariable (siONo ? "Sí" : "No");
      }
    });
    panelGravedadReal = new TiraOpciones ("Active o desactive la gravedad real");
    panelGravedadReal.setEtiquetaPauta ("Gravedad Real: ");
    panelGravedadReal.setAccionIzquierda (new AbstractAction ("", iconoBotonIzquierda)
    {
      public void actionPerformed (ActionEvent e)
      {
        boolean siONo = !opcionesJuego.getGravedadReal ();
        opcionesJuego.setGravedadReal (siONo);
        panelGravedadReal.setEtiquetaVariable (siONo ? "Sí" : "No");
      }
    });
    panelGravedadReal.setAccionDerecha (new AbstractAction ("", iconoBotonDerecha)
    {
      public void actionPerformed (ActionEvent e)
      {
        boolean siONo = !opcionesJuego.getGravedadReal ();
        opcionesJuego.setGravedadReal (siONo);
        panelGravedadReal.setEtiquetaVariable (siONo ? "Sí" : "No");
      }
    });
    vistaPreviaFondoPanel = new TiraVistaPrevia ("Seleccione la imagen para el fondo de la ventana");
    vistaPreviaFondoPanel.setEtiquetaPauta ("Fondo Ventana: ");
    vistaPreviaFondoPanel.setAccionIzquierda (new AbstractAction ("", iconoBotonIzquierda)
    {
      public void actionPerformed (ActionEvent e)
      {
        if ((fondoPanel - 1 < 0) || (fondosPanelDisponibles [fondoPanel - 1].equals ("")))
          fondoPanel = 4;
        opcionesJuego.setFondoPanel (fondosPanelDisponibles [--fondoPanel]);
        vistaPreviaFondoPanel.setEtiquetaVariable
            (Tetris.getImagen (fondosPanelDisponibles [fondoPanel],
                               "Fondo ventana: " + fondosPanelDisponibles [fondoPanel]),
             "Fondo " + (fondoPanel + 1));
      }
    });
    vistaPreviaFondoPanel.setAccionDerecha (new AbstractAction ("", iconoBotonDerecha)
    {
      public void actionPerformed (ActionEvent e)
      {
        if ((fondoPanel + 1 > 3) || (fondosPanelDisponibles [fondoPanel + 1].equals ("")))
          fondoPanel = -1;
        opcionesJuego.setFondoPanel (fondosPanelDisponibles [++fondoPanel]);
        vistaPreviaFondoPanel.setEtiquetaVariable
            (Tetris.getImagen (fondosPanelDisponibles [fondoPanel],
                               "Fondo ventana: " + fondosPanelDisponibles [fondoPanel]),
             "Fondo " + (fondoPanel + 1));
      }
    });
    vistaPreviaFondoCuadricula = new TiraVistaPrevia ("Seleccione la imagen para el panel de juego");
    vistaPreviaFondoCuadricula.setEtiquetaPauta ("Fondo Cuadrícula: ");
    vistaPreviaFondoCuadricula.setAccionIzquierda (new AbstractAction ("", iconoBotonIzquierda)
    {
      public void actionPerformed (ActionEvent e)
      {
        if ((fondoCuadricula - 1 < 0) || (fondosCuadriculaDisponibles [fondoCuadricula - 1].equals ("")))
        {
          fondoCuadricula = 4;
          if (fondosCuadriculaDisponibles [fondoCuadricula - 1].equals (""))
            fondoCuadricula--;
        }
        opcionesJuego.setFondoCuadricula (fondosCuadriculaDisponibles [--fondoCuadricula]);
        vistaPreviaFondoCuadricula.setEtiquetaVariable
            (Tetris.getImagen (fondosCuadriculaDisponibles [fondoCuadricula],
                               "Fondo cuadrícula: " + fondosCuadriculaDisponibles [fondoCuadricula]),
             "Fondo " + (fondoCuadricula + 1));
      }
    });
    vistaPreviaFondoCuadricula.setAccionDerecha (new AbstractAction ("", iconoBotonDerecha)
    {
      public void actionPerformed (ActionEvent e)
      {
        if ((fondoCuadricula + 1 > 3) || (fondosCuadriculaDisponibles [fondoCuadricula + 1].equals ("")))
          fondoCuadricula = -1;
        opcionesJuego.setFondoCuadricula (fondosCuadriculaDisponibles [++fondoCuadricula]);
        vistaPreviaFondoCuadricula.setEtiquetaVariable
            (Tetris.getImagen (fondosCuadriculaDisponibles [fondoCuadricula],
                               "Fondo cuadrícula: " + fondosCuadriculaDisponibles [fondoCuadricula]),
             "Fondo " + (fondoCuadricula + 1));
      }
    });
    /** Ahora se inicializan las etiquetas variables en todos los sub-paneles. */
    ajustaEtiquetasVariablesOpciones ();

    opciones = new JPanel ();
    opciones.setBackground (Color.white);
    opciones.setLayout (new BorderLayout ());
    JPanel panel = new JPanel ();
    panel.setBackground (Color.white);
    panel.setLayout (new GridLayout (8, 1));
    panel.add (panelNivelInicial);
    panel.add (panelLineasCambioNivel);
    panel.add (panelLineasIniciales);
    panel.add (panelCuadradosAncho);
    panel.add (panelCuadradosAlto);
    panel.add (panelDisenoPieza);
    panel.add (panelSeVeSiguientePieza);
    panel.add (panelGravedadReal);
    opciones.add (vistaPreviaFondoPanel, BorderLayout.WEST);
    opciones.add (panel, BorderLayout.CENTER);
    opciones.add (vistaPreviaFondoCuadricula, BorderLayout.EAST);
    addTab ("Opciones", opciones);

    /** Panel 'controles': En este panel se pueden seleccionar las teclas asociadas a las acciones
                           para controlar el juego. */
    controles = new JPanel ();
    controles.setLayout (new GridLayout (6, 2));
    controles.setBackground (Color.white);
    /** En este array se almacenan todas las teclas que ejecutan una acción en el juego. */
    int tablaControles [] = opcionesJuego.getControles ();
    /** Se inicializan cada 'Texto' con una de las teclas de control. */
    for (byte i = 0; i < tablaControles.length; i++)
      textoControles [i] = new Texto (tablaControles [i]);
    /** Cada 'Texto' va a un panel con una descripción de la acción que activa su tecla. */
    TiraControl tiraIzquierda = new TiraControl (textoControles [0], "Izquierda",
                                                "Mueva la pieza un espacio a la izquierda.");
    TiraControl tiraDerecha = new TiraControl (textoControles [1], "Derecha",
                                              "Mueva la pieza un espacio a la derecha.");
    TiraControl tiraAbajo = new TiraControl (textoControles [2], "Abajo",
                                            "Mueva la pieza un espacio abajo.");
    TiraControl tiraAbajoDelTodo = new TiraControl (textoControles [3], "Abajo del Todo",
                                                   "Deposite la pieza al fondo.");
    TiraControl tiraRotaIzquierda = new TiraControl (textoControles [4], "Rota Izquierda",
                                                    "Gire la pieza en sentido anti-horario.");
    TiraControl tiraRotaDerecha = new TiraControl (textoControles [5], "Rota Derecha",
                                                  "Gire la pieza en sentido horario.");
    TiraControl tiraComienzaPausa = new TiraControl (textoControles [6], "Comenzar/Pausar",
                                                    "Active el juego, o páuselo.");
    TiraControl tiraOpciones = new TiraControl (textoControles [7], "Opciones",
                                               "Muestra las 'Opciones' del menú de inicio.");
    TiraControl tiraReset = new TiraControl (textoControles [8], "Reset", "Termine la partida.");
    TiraControl tiraNivel = new TiraControl (textoControles [10], "Subir Nivel",
                                            "Suba un nivel para acelerar la caida de las piezas.");
    TiraControl tiraSiguientePieza = new TiraControl (textoControles [12], "Ver Siguiente Pieza",
                                                     "Active o desactive la vista de la siguiente pieza.");
    TiraControl tiraGravedadReal = new TiraControl (textoControles [13], "Gravedad Real",
                                                   "Active o desactive la gravedad real.");
    controles.add (tiraIzquierda);
    controles.add (tiraDerecha);
    controles.add (tiraAbajo);
    controles.add (tiraAbajoDelTodo);
    controles.add (tiraRotaIzquierda);
    controles.add (tiraRotaDerecha);
    controles.add (tiraComienzaPausa);
    controles.add (tiraOpciones);
    controles.add (tiraReset);
    controles.add (tiraNivel);
    controles.add (tiraSiguientePieza);
    controles.add (tiraGravedadReal);
    addTab ("Controles", controles);

    /** Panel 'piezasDisponibles: Aquí se pueden seleccionar las 28 piezas adicionales.
                                  A este panel se añaden 28 botones seleccionables, correspondientes
                                  a las piezas de su imagen. Cuando uno está pulsado, su pieza
                                  está disponible. Hay un 'toolTip' para cada botón. */
    piezasDisponibles = new JPanel ();
    piezasDisponibles.setBackground (Color.white);
    piezasDisponibles.setLayout (new GridLayout (4, 7));
    BotonIcono destructora = new BotonIcono (Tetris.getImagen ("destructor.gif", "Destructora"),
                                             opcionesJuego.getPiezaDisponible ((byte) 7));
    destructora.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 7, !opcionesJuego.getPiezaDisponible ((byte) 7));
      }
    });
    destructora.setToolTipText ("Destructora");
    piezasDisponibles.add (destructora);
    BotonIcono unCuadrado = new BotonIcono (Tetris.getImagen ("unCuadrado.gif", "Un cuadradillo"),
                                                          opcionesJuego.getPiezaDisponible ((byte) 8));
    unCuadrado.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 8, !opcionesJuego.getPiezaDisponible ((byte) 8));
      }
    });
    unCuadrado.setToolTipText ("Cuadradillo");
    piezasDisponibles.add (unCuadrado);
    BotonIcono barraDos = new BotonIcono (Tetris.getImagen ("barraDos.gif", "Barra de dos"),
                                                        opcionesJuego.getPiezaDisponible ((byte) 9));
    barraDos.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 9, !opcionesJuego.getPiezaDisponible ((byte) 9));
      }
    });
    barraDos.setToolTipText ("Barra dos");
    piezasDisponibles.add (barraDos);
    BotonIcono escaleraDos = new BotonIcono (Tetris.getImagen ("escaleraDos.gif", "Escalera de dos"),
                                                           opcionesJuego.getPiezaDisponible ((byte) 10));
    escaleraDos.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 10, !opcionesJuego.getPiezaDisponible ((byte) 10));
      }
    });
    escaleraDos.setToolTipText ("Diagonal dos");
    piezasDisponibles.add (escaleraDos);
    BotonIcono barraTres = new BotonIcono (Tetris.getImagen ("barraTres.gif", "Barra de tres"),
                                                         opcionesJuego.getPiezaDisponible ((byte) 11));
    barraTres.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 11, !opcionesJuego.getPiezaDisponible ((byte) 11));
      }
    });
    barraTres.setToolTipText ("Barra tres");
    piezasDisponibles.add (barraTres);
    BotonIcono eseTres = new BotonIcono (Tetris.getImagen ("eseTres.gif", "Ese de tres"),
                                                       opcionesJuego.getPiezaDisponible ((byte) 12));
    eseTres.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 12, !opcionesJuego.getPiezaDisponible ((byte) 12));
      }
    });
    eseTres.setToolTipText ("Ese tres");
    piezasDisponibles.add (eseTres);
    BotonIcono zetaTres = new BotonIcono (Tetris.getImagen ("zetaTres.gif", "Zeta de tres"),
                                                        opcionesJuego.getPiezaDisponible ((byte) 13));
    zetaTres.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 13, !opcionesJuego.getPiezaDisponible ((byte) 13));
      }
    });
    zetaTres.setToolTipText ("Zeta tres");
    piezasDisponibles.add (zetaTres);
    BotonIcono escaleraTres = new BotonIcono (Tetris.getImagen ("escaleraTres.gif", "Escalera de tres"),
                                                            opcionesJuego.getPiezaDisponible ((byte) 14));
    escaleraTres.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 14, !opcionesJuego.getPiezaDisponible ((byte) 14));
      }
    });
    escaleraTres.setToolTipText ("Diagonal tres");
    piezasDisponibles.add (escaleraTres);
    BotonIcono eleTres = new BotonIcono (Tetris.getImagen ("eleTres.gif", "Ele de tres"),
                                                       opcionesJuego.getPiezaDisponible ((byte) 15));
    eleTres.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 15, !opcionesJuego.getPiezaDisponible ((byte) 15));
      }
    });
    eleTres.setToolTipText ("Ele tres");
    piezasDisponibles.add (eleTres);
    BotonIcono teTres = new BotonIcono (Tetris.getImagen ("teTres.gif", "Te de tres"),
                                                      opcionesJuego.getPiezaDisponible ((byte) 16));
    teTres.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 16, !opcionesJuego.getPiezaDisponible ((byte) 1616
      }
    });
    teTres.setToolTipText ("Uve tres");
    piezasDisponibles.add (teTres);
    BotonIcono olasCuatro = new BotonIcono (Tetris.getImagen ("olasCuatro.gif", "Olas"),
                                                          opcionesJuego.getPiezaDisponible ((byte) 17));
    olasCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 17, !opcionesJuego.getPiezaDisponible ((byte) 17));
      }
    });
    olasCuatro.setToolTipText ("Olas");
    piezasDisponibles.add (olasCuatro);
    BotonIcono olasInvertidasCuatro = new BotonIcono (Tetris.getImagen ("olasInvertidasCuatro.gif",
                                                                        "Olas invertidas"),
                                                                    opcionesJuego.getPiezaDisponible ((byte) 18));
    olasInvertidasCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 18, !opcionesJuego.getPiezaDisponible ((byte) 18));
      }
    });
    olasInvertidasCuatro.setToolTipText ("Olas invertidas");
    piezasDisponibles.add (olasInvertidasCuatro);
    BotonIcono paralelasCuatro = new BotonIcono (Tetris.getImagen ("paralelasCuatro.gif", "Paralelas"),
                                                               opcionesJuego.getPiezaDisponible ((byte) 19));
    paralelasCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 19, !opcionesJuego.getPiezaDisponible ((byte) 19));
      }
    });
    paralelasCuatro.setToolTipText ("Paralelas");
    piezasDisponibles.add (paralelasCuatro);
    BotonIcono eseSeparadaCuatro = new BotonIcono (Tetris.getImagen ("eseSeparadaCuatro.gif", "Ese separada"),
                                                                 opcionesJuego.getPiezaDisponible ((byte) 20));
    eseSeparadaCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 20, !opcionesJuego.getPiezaDisponible ((byte) 20));
      }
    });
    eseSeparadaCuatro.setToolTipText ("Ese separada");
    piezasDisponibles.add (eseSeparadaCuatro);
    BotonIcono zetaSeparadaCuatro = new BotonIcono (Tetris.getImagen ("zetaSeparadaCuatro.gif", "Zeta separada"),
                                                                  opcionesJuego.getPiezaDisponible ((byte) 21));
    zetaSeparadaCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 21, !opcionesJuego.getPiezaDisponible ((byte) 21));
      }
    });
    zetaSeparadaCuatro.setToolTipText ("Zeta separada");
    piezasDisponibles.add (zetaSeparadaCuatro);
    BotonIcono escaleraCuatro = new BotonIcono (Tetris.getImagen ("escaleraCuatro.gif", "Escalera"),
                                                              opcionesJuego.getPiezaDisponible ((byte) 22));
    escaleraCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 22, !opcionesJuego.getPiezaDisponible ((byte) 22));
      }
    });
    escaleraCuatro.setToolTipText ("Diagonal");
    piezasDisponibles.add (escaleraCuatro);
    BotonIcono comaCuatro = new BotonIcono (Tetris.getImagen ("comaCuatro.gif", "Coma"),
                                                          opcionesJuego.getPiezaDisponible ((byte) 23));
    comaCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        public void actionPerformed ((byte) 23, !opcionesJuego.getPiezaDisponible ((byte) 23));
      }
    });
    comaCuatro.setToolTipText ("Coma");
    piezasDisponibles.add (comaCuatro);
    BotonIcono comaInvertidaCuatro = new BotonIcono (Tetris.getImagen ("comaInvertidaCuatro.gif", "Coma invertida"),
                                                                   opcionesJuego.getPiezaDisponible ((byte) 24));
    comaInvertidaCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 24, !opcionesJuego.getPiezaDisponible ((byte) 24));
      }
    });
    comaInvertidaCuatro.setToolTipText ("Coma invertida");
    piezasDisponibles.add (comaInvertidaCuatro);
    BotonIcono anguloRectoCuatro = new BotonIcono (Tetris.getImagen ("anguloRectoCuatro.gif", "Ángulo recto"),
                                                                 opcionesJuego.getPiezaDisponible ((byte) 25));
    anguloRectoCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 25, !opcionesJuego.getPiezaDisponible ((byte) 25));
      }
    });
    anguloRectoCuatro.setToolTipText ("Ángulo recto");
    piezasDisponibles.add (anguloRectoCuatro);
    BotonIcono uveCuatro = new BotonIcono (Tetris.getImagen ("uveCuatro.gif", "Uve"),
                                                         opcionesJuego.getPiezaDisponible ((byte) 26));
    uveCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 26, !opcionesJuego.getPiezaDisponible ((byte) 26));
      }
    });
    uveCuatro.setToolTipText ("Uve");
    piezasDisponibles.add (uveCuatro);
    BotonIcono uveInvertidaCuatro = new BotonIcono (Tetris.getImagen ("uveInvertidaCuatro.gif", "Uve invertida"),
                                                                  opcionesJuego.getPiezaDisponible ((byte) 27));
    uveInvertidaCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 27, !opcionesJuego.getPiezaDisponible ((byte) 27));
      }
    });
    uveInvertidaCuatro.setToolTipText ("Uve invertida");
    piezasDisponibles.add (uveInvertidaCuatro);
    BotonIcono eseLargaCuatro = new BotonIcono (Tetris.getImagen ("eseLargaCuatro.gif", "Ese larga"),
                                                              opcionesJuego.getPiezaDisponible ((byte) 28));
    eseLargaCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 28, !opcionesJuego.getPiezaDisponible ((byte) 28));
      }
    });
    eseLargaCuatro.setToolTipText ("Ese larga");
    piezasDisponibles.add (eseLargaCuatro);
    BotonIcono zetaLargaCuatro = new BotonIcono (Tetris.getImagen ("zetaLargaCuatro.gif", "Zeta larga"),
                                                opcionesJuego.getPiezaDisponible ((byte) 29));
    zetaLargaCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 29, !opcionesJuego.getPiezaDisponible ((byte) 29));
      }
    });
    zetaLargaCuatro.setToolTipText ("Zeta larga");
    piezasDisponibles.add (zetaLargaCuatro);
    BotonIcono sombreroCuatro = new BotonIcono (Tetris.getImagen ("sombreroCuatro.gif", "Sombrero"),
                                                              opcionesJuego.getPiezaDisponible ((byte) 30));
    sombreroCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 30, !opcionesJuego.getPiezaDisponible ((byte) 30));
      }
    });
    sombreroCuatro.setToolTipText ("Sombrero");
    piezasDisponibles.add (sombreroCuatro);
    BotonIcono flechaCuatro = new BotonIcono (Tetris.getImagen ("flechaCuatro.gif", "Flecha"),
                                                            opcionesJuego.getPiezaDisponible ((byte) 31));
    flechaCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 31, !opcionesJuego.getPiezaDisponible ((byte) 31));
      }
    });
    flechaCuatro.setToolTipText ("Flecha");
    piezasDisponibles.add (flechaCuatro);
    BotonIcono acentoCerradoCuatro = new BotonIcono (Tetris.getImagen ("acentoCerradoCuatro.gif", "Acento cerrado"),
                                                                   opcionesJuego.getPiezaDisponible ((byte) 32));
    acentoCerradoCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 32, !opcionesJuego.getPiezaDisponible ((byte) 32));
      }
    });
    acentoCerradoCuatro.setToolTipText ("Acento cerrado");
    piezasDisponibles.add (acentoCerradoCuatro);
    BotonIcono acentoAbiertoCuatro = new BotonIcono (Tetris.getImagen ("acentoAbiertoCuatro.gif", "Acento abierto"),
                                                                   opcionesJuego.getPiezaDisponible ((byte) 33));
    acentoAbiertoCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 33, !opcionesJuego.getPiezaDisponible ((byte) 33));
      }
    });
    acentoAbiertoCuatro.setToolTipText ("Acento abierto");
    piezasDisponibles.add (acentoAbiertoCuatro);
    BotonIcono mediaAspaCuatro = new BotonIcono (Tetris.getImagen ("mediaAspaCuatro.gif", "Media aspa"),
                                                               opcionesJuego.getPiezaDisponible ((byte) 34));
    mediaAspaCuatro.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        opcionesJuego.setPiezaDisponible ((byte) 34, !opcionesJuego.getPiezaDisponible ((byte) 34));
      }
    });
    mediaAspaCuatro.setToolTipText ("Media aspa");
    piezasDisponibles.add (mediaAspaCuatro);
    addTab ("Piezas disponibles", piezasDisponibles);

    /** Se inicializa el panel 'top10' con el ránking en el archivo de opciones. */
    etiquetaClasificacion = new JLabel ();
    refrescaListado ();
    etiquetaClasificacion.setFont (new Font ("Showcard Gothic", Font.BOLD, 30));
    etiquetaClasificacion.setForeground (Color.blue);
    top10 = new JPanel ();
    top10.setBackground (Color.white);
    top10.add (etiquetaClasificacion);
    addTab ("Top 10", top10);

    /** Finalmente, se inicializa el contenido del panel de información, que son 2 etiquetas:
          - La primera lleva una parrafada en 'HTML' que alaba el juego, y comenta algunas de sus
            interesantes características.
          - La segunda lleva un dibujito explicativo de lo de la 'gravedad real', y un consejo
            sobre el tamaño del monitor. */
    JLabel etiqueta1 = new JLabel ();
    String cadena1 = "<HTML> <FONT FACE= \"Showcard Gothic\" SIZE=\"4\" COLOR=BLUE>"
                     + "</LI> === ¡Lobetris: El nuevo y mejorado clon del clásico juego de Alexey Pajitnov! === <BR>"
                     + "<FONT FACE= \"Arial\" SIZE=\"2\" COLOR=BLUE>"
                     + "<UL> ¡Conozca sus prestaciones, todas ellas con un suave acabado en blanco y bordes azules curvados!: <BR>"
                     + "<UL> <LI> ¡Escoja el diseño de las piezas, y la imagen de fondo para la ventana y el panel de juego! <BR>"
                     + "Escoja la dificultad inicial del juego, las líneas medio rellenas para empezar la partida, <BR>"
                     + "las líneas necesarias para subr nivel... ¡Incluso puede subir el nivel en medio de la partida! <BR>"
                     + "¡Escoja usted mismo las teclas para controlar el juego! <BR>"
                     + "<LI> ¡Modifique la altura y la anchura de la cuadrícula de juego! ¡Experimente con proporciones <BR>"
                     + "distintas al clásico 10 x 18! <BR>"
                     + "<LI> ¡Añada dificultad al juego desactivando el panel de la siguiente pieza! <BR>"
                     + "<LI> ¡Dispone de 28 piezas adicionales que puede activar y desactivar durante la partida <BR>"
                     + "-conozca la pieza destructora, un cuadradillo parpadeante que revienta todo lo que toca! <BR>"
                     + "<LI> ¡Y pruebe jugar con la 'gravedad mejorada' activada!: <BR>"
                     + "En los Tetris clásicos, cuando unas líneas se completan y desaparecen, los bloques por encima bajan <BR>"
                     + "una distancia igual al número de líneas que se han completado bajo ellos. <BR>"
                     + "Con este algoritmo, en algunos momentos de la partida, los bloques pueden flotar. <BR>"
                     + "Lloptetris brinda, mediante su 'gravedad mejorada', la posibilidad de tratar cada bloque individualmente <BR>"
                     + "para que baje hasta donde pueda. Esto dará lugar a reacciones en cadena, a veces inesperadas, que <BR>"
                     + "consisten en bloques que caen y llenan líneas adicionales -el juego las recompensará con mayor puntuación. <BR>"
                     + "¡Con la gravedad mejorada, puedes llegar a reventar casi medio panel de golpe! </UL> </UL> <BR>";
    etiqueta1.setText (cadena1);
    JLabel etiqueta2 = new JLabel ("<HTML><FONT FACE= \"Arial\" SIZE=\"2\" COLOR=BLUE> El juego está optimizado <BR> para pantallas de 800 x 600.",
                                   Tetris.getImagen ("gravedad.png",
                                   "Ilustra el efecto de la gravedad mejorada."), JLabel.CENTER);
    etiqueta2.setFont (new Font ("Courier New", Font.PLAIN, 12));
    etiqueta2.setForeground (Color.blue);
    etiqueta2.setBorder (new EmptyBorder (0, 15, 15, 15));
    informacion = new JPanel ();
    informacion.setBackground (Color.white);
    informacion.setLayout (new BorderLayout ());
    informacion.add (etiqueta1, BorderLayout.CENTER);
    informacion.add (etiqueta2, BorderLayout.SOUTH);
    addTab ("Información", informacion);
  }

  /** Método que define el contenido de todas las 'etiquetas variables' en los sub-paneles
      del panel 'OPCIONES'. */
  public void ajustaEtiquetasVariablesOpciones ()
  {
    panelNivelInicial.setEtiquetaVariable (opcionesJuego.getNivelInicial ());
    panelLineasCambioNivel.setEtiquetaVariable (opcionesJuego.getLineasCambioNivel ());
    panelLineasIniciales.setEtiquetaVariable (opcionesJuego.getLineasRellenasInicio());
    panelCuadradosAncho.setEtiquetaVariable (opcionesJuego.getCuadradosX ());
    panelCuadradosAlto.setEtiquetaVariable ((byte) (opcionesJuego.getCuadradosY () - 3));
    panelDisenoPieza.setEtiquetaVariable
        (Tetris.getImagen (opcionesJuego.getDiseno () + "Blanco.gif",
                           "Diseño de las piezas: " + opcionesJuego.getDiseno ()),
         disenosDisponibles [disenoPieza]);
    panelSeVeSiguientePieza.setEtiquetaVariable (opcionesJuego.getSeVeSiguientePieza () ? "Sí" : "No");
    panelGravedadReal.setEtiquetaVariable (opcionesJuego.getGravedadReal () ? "Sí" : "No");
    vistaPreviaFondoPanel.setEtiquetaVariable
        (Tetris.getImagen (opcionesJuego.getFondoPanel (),
                           "Fondo de la ventana: " + opcionesJuego.getFondoPanel ()),
         "Fondo " + (fondoPanel + 1));
    vistaPreviaFondoCuadricula.setEtiquetaVariable
        (Tetris.getImagen (opcionesJuego.getFondoCuadricula (),
                           "Fondo de la cuadrícula: " + opcionesJuego.getFondoCuadricula ()),
         "Fondo " + (fondoCuadricula + 1));
  }

  /** Se introduce la lista con el 'top10' de 'opcionesJuego' en la etiqueta del panel 'top10'. */
  public void refrescaListado ()
  {
    etiquetaClasificacion.setText (opcionesJuego.getTop10 ());
  }

  /** Muestra el panel representado por el argumento de la función.
      @param pestana byte  : Valor que corresponde al panel que se desea mostrar en el 'JTabbedPane'.
                             Conviene que sea una de las variables estáticas finales de la clase. */
  public void seleccionaPestana (byte pestana)
  {
    setSelectedIndex (pestana);
  }

  /** Función utilizada para comprobar que una misma tecla no esté asociada a dos acciones.
      Si se da el caso, la acción que antes tenía la tecla repetida pasa a tener asociada la
      tecla que antes tenía la otra acción. */
  public void ajustaControles ()
  {
    /** Dos arrays de enteros para los antiguos y los nuevos controles. */
    int viejosControles [] = opcionesJuego.getControles ();
    byte tamanoTablaControles = (byte) viejosControles.length;
    int nuevosControles [] = new int [tamanoTablaControles];
    int teclaNueva;
    int teclaAntigua;
    byte numeroTecla;
    byte i;
    /** En este bucle se detecta qué acción ha cambiado de tecla -o qué 'Texto' ha cambiado
        su variable 'tecla'. */
    for (i = 0; i < tamanoTablaControles; i++)
      if (viejosControles [i] != textoControles [i].getTecla ())
        break;
    /** Si ninguna acción ha cambiado de tecla, termina la función. */
    if (i == tamanoTablaControles)
      return;
    /** 'nuevosControles' debe tomar los valores de 'viejosControles', y lo hace con un bucle.
        Ahora que se conoce las teclas anterior y actual de la acción de marras, y en qué 'Texto'
        está representada, en el bucle: 1 - la acción que ha cambiado de tecla queda asociada a la nueva,
                                        y 2 - si otra acción lleva esa misma tecla, se asociará a
                                              'teclaAntigua'. */
    teclaNueva = textoControles [i].getTecla ();
    teclaAntigua = textoControles [i].getTeclaAnterior ();
    numeroTecla = i;
    for (i = 0; i < tamanoTablaControles; i++)
      if (numeroTecla != i)
      {
        if (viejosControles [i] == teclaNueva)
        {
          textoControles [i].setTecla (teclaAntigua);
          /** Si la descripción de la tecla es una cadena vacía, se reemplazará por la descripción que
              proporciona el método 'KeyEvent.getKeytext (int)'. */
          if (textoControles [i].getText ().equals (""))
            textoControles [i].setText (KeyEvent.getKeyText (textoControles [i].getTecla ()));
          nuevosControles [i] = teclaAntigua;
        }
        else
          nuevosControles [i] = viejosControles [i];
      }
      else
        nuevosControles [i] = teclaNueva;
    /** Finalmente, se actualizan los 'controles' en 'opcionesJuego'. */
    opcionesJuego.setControles (nuevosControles);
  }





Clase TiraControl

  /** Clase interna que, al igual que 'TiraOpciones' y 'TiraVistaPrevia', hace de sub-panel.
  
      Consta de un campo de texto 'Texto' -otra clase interna y la razón por la que esta clase
      lo es-, y una etiqueta. Su propósito es proporcionar al usuario una interfaz
      algo alaborada para que pueda elegir las teclas de control. */
  class TiraControl extends JPanel
  {
    // Variables de la clase.
    private GridBagConstraints restricciones;
    private Texto cajaTexto;
    private JLabel etiqueta;

    /** Constructor. Inicializa las variables de clase con los valores de los argumentos.
        @param nuevaCajaTexto Texto  : El campo de texto que llevará la 'TiraControl'.
        @param textoEtiqueta String  : Texto que mostrará la etiqueta en el panel.
        @param nuevoToolTip String   : 'toolTip' para la etiqueta. */
    public TiraControl (Texto nuevaCajaTexto, String textoEtiqueta, String nuevoToolTip)
    {
      super ();

      /** Inicializa las variables de la clase. */
      restricciones = new GridBagConstraints ();
      cajaTexto = nuevaCajaTexto;
      cajaTexto.setToolTipText (nuevoToolTip);
      etiqueta = new JLabel (textoEtiqueta);
      etiqueta.setFont (new Font ("Showcard Gothic", Font.PLAIN, 14));
      etiqueta.setForeground (Color.blue);

      /** Pone color de fondo, y el Layout. */
      setBackground (Color.white);
      setLayout (new GridBagLayout ());

      /** Añade los componentes al panel. */
      restricciones.fill = GridBagConstraints.BOTH;
      restricciones.gridheight = GridBagConstraints.REMAINDER;
      restricciones.weightx = 0;
      add (cajaTexto, restricciones);
      add (etiqueta, restricciones);
    }

    /** Función sobrecargada para pintar el borde del panel.
        @param graficos Graphics  : Contexto 'Graphics' sobre el que pintar. */
    public void paintBorder (Graphics graficos)
    {
      graficos.setColor (Color.black);
      graficos.drawRoundRect (2, 2, getSize ().width - 5, getSize ().height - 5, 40, 40);
      graficos.setColor (Color.blue);
      graficos.drawRoundRect (10, 20, getSize ().width - 21, getSize ().height - 31, 40, 40);
    }
  }





Clase Texto

  /** Clase interna que extiende 'JTextField'.
  
      Tiene dos variables enteras correspondientes a dos 'virtual key codes'. Estos dos valores
      corresponden a la tecla que ejecuta una acción, y a la que antes lo hacía.
	  
      También tiene un 'KeyListener': éste ajusta el valor de 'tecla' según la tecla pulsada. */
  class Texto extends JTextField implements KeyListener
  {
    // Variables de la calse.
    private int tecla;
    private int teclaAnterior;

    /** Constructor.
        @param nuevaTecla int  : Valor para inicializar 'tecla'. */
    public Texto (int nuevaTecla)
    {
      super ();
      /** Inicializa la variable de clase. */
      tecla = nuevaTecla;
      /** Pone tamaño al contenedor, fuente, color de la fuente, algo de márgen, y centra el texto. */
      setPreferredSize (new Dimension (200, 25));
      setFont (new Font ("Arial", Font.BOLD, 14));
      setForeground (Color.green.darker ());
      //setBorder (new EmptyBorder (10, 10, 10, 10));
      setHorizontalAlignment (JLabel.CENTER);
      /** Se añade el oyente del teclado. */
      addKeyListener (this);
      /** Finalmente, se añade el texto -la descripción de la tecla. */
      setText (con.getDescripcion (tecla));
      if (getText ().equals (""))
        setText (KeyEvent.getKeyText (tecla));
    }

    /** Define el valor almacenado en 'tecla'. 'teclaAntigua' toma  el valor que tenía tecla, y
        el texto en el campo se ajusta a la descripción de la nueva 'tecla'.
        @param nuevaTecla int  : Nuevo valor para 'tecla'. */
    public void setTecla (int nuevaTecla)
    {
      teclaAnterior = tecla;
      tecla = nuevaTecla;
      setText (con.getDescripcion (tecla));
    }

    /** Método para conocer el valor de 'tecla'.
        @return int  : Valor de 'tecla'. */
    public int getTecla ()
    {
      return tecla;
    }

    /** Método para conocer el valor de 'teclaAnterior'.
        @return int  : Valor de tecla anterior. */
    public int getTeclaAnterior ()
    {
      return teclaAnterior;
    }

    /** Función sobrecargada para pintar el borde del panel.
        @param graficos Graphics  : Contexto 'Graphics' sobre el que pintar. */
    public void paintBorder (Graphics graficos)
    {
      graficos.setColor (Color.green.darker ());
      graficos.drawRoundRect (0, 10, getSize ().width - 1, getSize ().height - 16, 20, 20);
    }

    // Funciones sobrecargadas de la interfaz 'KeyListener'.
    /** Esta función se ejectuta sólo con apretar una tecla. ¿Por qué no sobrecargar 'keyTyped ()'?
        'keyPressed ()' genera eventos de bajo nivel, lo que significa que teclas modificadoras
        o de acción serán tratadas individualmente; esto no pasaría con 'keyTyped ()', que, al estar
        atento a caracteres unicode, puede ejecutarse después de 2 'keyPressed ()'; ej. 'Shift' + 'S'.
        Como interesa que el usuario pueda escojer todas las teclas posibles, la elección está clara. 
		
        'tecla' toma el valor del 'virtual key code' de la tecla pulsada, y se comprueba que todos los
        'Texto' de la clase principal tengan una 'tecla' distinta.
        @param evento KeyEvent  : Evento correspondiente a la tecla pulsada. */
    public synchronized void keyPressed (KeyEvent evento)
    {
      setTecla (evento.getKeyCode ());
      ajustaControles ();
    }
    public void keyReleased (KeyEvent evento) {}
    public void keyTyped (KeyEvent evento) {}
  }
}





Clase TiraOpciones

package ejercicio_5;

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

/** 'JPanel' con una etiqueta, un botón, otra etiqueta, y otro botón. El panel tiene el aspecto de una
    tira. Incluye métodos para asignar acciones a los botones, y poner iconos o texto a las etiquetas. */
public class TiraOpciones extends JPanel
{
  /** Variables de la clase. */
  private GridBagConstraints restricciones;
  private JLabel etiqueta;
  private BotoncilloIcono izquierda;
  private BotoncilloIcono derecha;
  private EtiquetaOpciones etiquetaVariable;

  /** Contructor. Inicializa los componentes del panel, pero no les pone ni texto ni iconos -salvo
      el 'toolTip'.
      @param nuevoToolTip String  : 'toolTip' para la 'etiqueta'. */
  public TiraOpciones (String nuevoToolTip)
  {
    super ();

    /** Inicializa las variables de la clase. */
    restricciones = new GridBagConstraints ();
    etiqueta = new JLabel ();
    etiqueta.setToolTipText (nuevoToolTip);
    etiqueta.setFont (new Font ("Showcard Gothic", Font.BOLD, 16));
    etiqueta.setForeground (Color.blue);
    izquierda = new BotoncilloIcono ();
    derecha = new BotoncilloIcono ();
    etiquetaVariable = new EtiquetaOpciones ();

    /** Pone color de fondo, un pequeño márgen, y el Layout. */
    setBackground (Color.white);
    setBorder (new EmptyBorder (5, 5, 5, 5));
    setLayout (new GridBagLayout ());

    /** Añade los componentes al panel. */
    restricciones.fill = GridBagConstraints.BOTH;
    restricciones.gridheight = GridBagConstraints.REMAINDER;
    restricciones.weightx = 1;
    add (etiqueta, restricciones);
    restricciones.weightx = 0;
    add (izquierda, restricciones);
    add (etiquetaVariable, restricciones);
    add (derecha, restricciones);
  }

  /** Define la línea de texto de la 'JLabel'.
      @param texto String  : Nuevo texto para la 'etiqueta'. */
  public void setEtiquetaPauta (String texto)
  {
    etiqueta.setText (texto);
  }

  /** Define la acción del botón 'izquierda'.
      @param accion Action  : Nueva acción para el botón. */
  public void setAccionIzquierda (Action accion)
  {
    izquierda.setAction (accion);
  }

  /** Define la acción del botón 'derecha'.
      @param accion Action  : Nueva acción para el botón. */
  public void setAccionDerecha (Action accion)
  {
    derecha.setAction (accion);
  }

  /** Define el icono para la 'etiquetaVariable', además de asignarle un 'toolTip'.
      @param icono ImageIcon      : Nuevo icono para la 'etiquetaVariable'.
      @param nuevoToolTip String  : Nuevo 'toolTip' para la 'etiquetaVariable'. */
  public void setEtiquetaVariable (ImageIcon icono, String nuevoToolTip)
  {
    etiquetaVariable.setIcon (icono);
    etiquetaVariable.setToolTipText (nuevoToolTip);
  }

  /** Define el texto en la 'etiquetaVariable' con el número pasado como argumento.
      @param valor byte  : Número que se mostrará en la 'JLabel'. */
  public void setEtiquetaVariable (byte valor)
  {
    etiquetaVariable.setText (String.valueOf (valor));
  }

  /** Define el texto en la 'etiquetaVariable'.
      @param valor byte  : Nuevo texto que se mostrará en la 'JLabel'. */
  public void setEtiquetaVariable (String texto)
  {
    etiquetaVariable.setText (texto);
  }

  /** Función sobrecargada para pintar el borde del panel.
      @param graficos Graphics  : Contexto 'Graphics' sobre el que pintar. */
  public void paintBorder (Graphics graficos)
  {
    graficos.setColor (Color.black);
    graficos.drawRoundRect (2, 2, getSize ().width - 5, getSize ().height - 5, 40, 40);
    graficos.setColor (Color.blue);
    graficos.drawRoundRect (10, 25, getSize ().width - 21, getSize ().height - 41, 40, 40);
  }
}





Clase TiraVistaPrevia

package ejercicio_5;

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

/** 'JPanel' con una etiqueta, dos botones, otra etiqueta -ésta ocupa la mayor parte del panel-,
    y otro botón. El panel es más alto que ancho. Incluye métodos para asignar acciones a los botones,
    y poner iconos o texto a las etiquetas. */
public class TiraVistaPrevia extends JPanel
{
  /** Variables de la clase. */
  private GridBagConstraints restricciones;
  private JLabel etiqueta;
  private BotoncilloIcono izquierda;
  private BotoncilloIcono derecha;
  private JLabel etiquetaVariable;

  /** Contructor. Inicializa los componentes del panel, pero no les pone ni texto ni iconos -salvo
      el 'toolTip'.
      @param nuevoToolTip String  : 'toolTip' para la 'etiqueta'. */
  public TiraVistaPrevia (String nuevoToolTip)
  {
    super ();

    /** Inicializa las variables de la clase. */
    restricciones = new GridBagConstraints ();
    etiqueta = new JLabel ();
    etiqueta.setToolTipText (nuevoToolTip);
    etiqueta.setFont (new Font ("Showcard Gothic", Font.BOLD, 16));
    etiqueta.setForeground (Color.blue);
    izquierda = new BotoncilloIcono ();
    derecha = new BotoncilloIcono ();
    etiquetaVariable = new JLabel ();
    etiquetaVariable.setPreferredSize (new Dimension (180, 350));

    /** Pone color de fondo, un pequeño márgen, y el Layout. */
    setBackground (Color.white);
    setBorder (new EmptyBorder (5, 5, 5, 5));
    setLayout (new GridBagLayout ());

    /** Añade los componentes al panel. */
    restricciones.fill = GridBagConstraints.BOTH;
    restricciones.gridwidth = GridBagConstraints.REMAINDER;
    add (etiqueta, restricciones);
    restricciones.gridwidth = 1;
    restricciones.weightx = 1;
    add (izquierda, restricciones);
    restricciones.gridwidth = GridBagConstraints.REMAINDER;
    add (derecha, restricciones);
    add (etiquetaVariable, restricciones);
  }

  /** Define la línea de texto de la 'JLabel'.
      @param texto String  : Nuevo texto para la 'etiqueta'. */
  public void setEtiquetaPauta (String texto)
  {
    etiqueta.setText (texto);
  }

  /** Define la acción del botón 'izquierda'.
      @param accion Action  : Nueva acción para el botón. */
  public void setAccionIzquierda (Action accion)
  {
    izquierda.setAction (accion);
  }

  /** Define la acción del botón 'derecha'.
      @param accion Action  : Nueva acción para el botón. */
  public void setAccionDerecha (Action accion)
  {
    derecha.setAction (accion);
  }

  /** Define el icono para la 'etiquetaVariable', además de asignarle un 'toolTip'.
      El icono se escala para que ocupe toda la 'JLabel'.
      @param icono ImageIcon      : Nuevo icono para la 'etiquetaVariable'.
      @param nuevoToolTip String  : Nuevo 'toolTip' para la 'etiquetaVariable'. */
  public void setEtiquetaVariable (ImageIcon icono, String nuevoToolTip)
  {
    if (icono.getIconWidth () != 180 || icono.getIconHeight () != 350)
      icono.setImage (icono.getImage ().getScaledInstance (180, 350, Image.SCALE_DEFAULT));
    etiquetaVariable.setIcon (icono);
    etiquetaVariable.setToolTipText (nuevoToolTip);
  }

  /** Función sobrecargada para pintar el borde del panel.
      @param graficos Graphics  : Contexto 'Graphics' sobre el que pintar. */
  public void paintBorder (Graphics graficos)
  {
    graficos.setColor (Color.blue);
    graficos.drawRoundRect (2, 2, getSize ().width - 5, getSize ().height - 5, 20, 20);
  }
}


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

Última actualización: 18-Feb-2007

Hosted by www.Geocities.ws

1