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