/**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Universidad de los Andes (Bogotá - Colombia)
* Departamento de Ingeniería de Sistemas y Computación
* Licenciado bajo el esquema Academic Free License version 2.1
*
* Proyecto Cupi2 (http://cupi2.uniandes.edu.co)
* Ejercicio: n5_examen
* Autor: Equipo Cupi2 2017
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
package uniandes.cupi2.examen.interfaz;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import uniandes.cupi2.examen.mundo.Pregunta;
/**
* Panel con la información de la pregunta.
*/
@SuppressWarnings("serial")
public class PanelPregunta extends JPanel implements ActionListener
{
// -----------------------------------------------------------------
// Constantes
// -----------------------------------------------------------------
/**
* Comando para guardar la respuesta dada a la pregunta actual.
*/
public final static String GUARDAR = "Guardar";
/**
* Comando avanzar.
*/
private static final String AVANZAR = ">";
/**
* Comando retroceder.
*/
private static final String RETROCEDER = "<";
/**
* Comando para cambiar la respuesta.
*/
private static final String CAMBIAR_RESPUESTA = "Cambiar_";
// -----------------------------------------------------------------
// Atributos
// -----------------------------------------------------------------
/**
* Ventana principal de la aplicación.
*/
private InterfazExamen principal;
/**
* Respuesta actualmente seleccionada.
*/
private String respuestaActual;
// -----------------------------------------------------------------
// Atributos de interfaz
// -----------------------------------------------------------------
/**
* Etiqueta con el numero de la pregunta.
*/
private JLabel etiquetaNumero;
/**
* Etiqueta con el texto de la pregunta.
*/
private JLabel etiquetaTexto;
/**
* Etiqueta con la imagen de la pregunta.
*/
private JLabel etiquetaImagen;
/**
* Cajas con las posibles respuestas.
*/
private JCheckBox[] cajaRespuesta;
/**
* Campo de texto estado.
*/
private JTextField txtResultado;
/**
* Campo de texto respuesta usuario.
*/
private JTextField txtRespuestaUsuario;
/**
* Campo de texto respuesta correcta.
*/
private JTextField txtRespuestaCorrecta;
/**
* Campo de texto puntaje obtenido.
*/
private JTextField txtPuntajeObtenido;
/**
* Botón guardar respuesta.
*/
private JButton btnGuardarRespuesta;
/**
* Botón avanzar.
*/
private JButton btnAvanzar;
/**
* Botón retroceder.
*/
private JButton btnRetroceder;
// -----------------------------------------------------------------
// Constructor
// -----------------------------------------------------------------
/**
* Constructor del panel.
* @param pPrincipal Ventana principal de la aplicación. pPrincipal != null.
*/
public PanelPregunta( InterfazExamen pPrincipal )
{
principal = pPrincipal;
setLayout( new BorderLayout( ) );
JPanel panelPregunta = new JPanel( );
add( panelPregunta, BorderLayout.NORTH );
// Usamos el BorderLayout
panelPregunta.setLayout( new BorderLayout( ) );
panelPregunta.setBackground( Color.GRAY );
// Etiqueta con el número de la pregunta
etiquetaNumero = new JLabel( );
etiquetaNumero.setFont( new Font( "Tahoma", Font.BOLD, 32 ) );
etiquetaNumero.setForeground( Color.WHITE );
panelPregunta.add( etiquetaNumero, BorderLayout.WEST );
// Etiqueta con el texto de la pregunta
etiquetaTexto = new JLabel( );
etiquetaTexto.setFont( new Font( "Arial", Font.BOLD, 18 ) );
etiquetaTexto.setForeground( Color.WHITE );
panelPregunta.add( etiquetaTexto, BorderLayout.CENTER );
// Etiqueta con la imagen de la bandera
etiquetaImagen = new JLabel( );
panelPregunta.add( etiquetaImagen, BorderLayout.EAST );
JPanel panelCentral = new JPanel( );
panelCentral.setLayout( new BorderLayout( ) );
add( panelCentral, BorderLayout.CENTER );
JPanel panelMedio = new JPanel( );
panelMedio.setLayout( new GridLayout( 1, 2 ) );
panelCentral.add( panelMedio, BorderLayout.CENTER );
JPanel panelRespuestas = new JPanel( );
panelRespuestas.setLayout( new GridLayout( Pregunta.MAX_RESPUESTAS, 1 ) );
panelRespuestas.setBorder( new EmptyBorder( 10, 30, 10, 10 ) );
panelRespuestas.setBackground( new Color( 248, 248, 248 ) );
panelMedio.add( panelRespuestas );
cajaRespuesta = new JCheckBox[Pregunta.MAX_RESPUESTAS];
for( int i = 0; i < Pregunta.MAX_RESPUESTAS; i++ )
{
cajaRespuesta[ i ] = new JCheckBox( "" );
cajaRespuesta[ i ].addActionListener( this );
String comando = CAMBIAR_RESPUESTA + i;
System.out.println( comando );
cajaRespuesta[ i ].setActionCommand( comando );
cajaRespuesta[ i ].setBackground( new Color( 248, 248, 248 ) );
panelRespuestas.add( cajaRespuesta[ i ] );
}
JPanel panelEstado = new JPanel( );
panelEstado.setLayout( new GridLayout( 5, 2, 2, 2 ) );
panelEstado.setSize( 500, 300 );
panelEstado.setBorder( new EmptyBorder( 10, 20, 10, 10 ) );
panelMedio.add( panelEstado );
JLabel labEstado = new JLabel( "Resultado:" );
panelEstado.add( labEstado );
txtResultado = new JTextField( );
txtResultado.setEditable( false );
panelEstado.add( txtResultado );
JLabel labRespuestaUsuario = new JLabel( "Respuesta Usuario:" );
panelEstado.add( labRespuestaUsuario );
txtRespuestaUsuario = new JTextField( );
txtRespuestaUsuario.setEditable( false );
panelEstado.add( txtRespuestaUsuario );
JLabel labRespuestaCorrecta = new JLabel( "Respuesta Correcta:" );
panelEstado.add( labRespuestaCorrecta );
txtRespuestaCorrecta = new JTextField( );
txtRespuestaCorrecta.setEditable( false );
panelEstado.add( txtRespuestaCorrecta );
JLabel labPuntajeObtenido = new JLabel( "Puntaje Obtenido:" );
panelEstado.add( labPuntajeObtenido );
txtPuntajeObtenido = new JTextField( );
txtPuntajeObtenido.setEditable( false );
panelEstado.add( txtPuntajeObtenido );
panelEstado.add( new JLabel( ) );
btnGuardarRespuesta = new JButton( GUARDAR );
btnGuardarRespuesta.addActionListener( this );
btnGuardarRespuesta.setActionCommand( GUARDAR );
panelEstado.add( btnGuardarRespuesta );
JPanel panelIzquierda = new JPanel( );
panelIzquierda.setBorder( new EmptyBorder( 5, 5, 0, 2 ) );
panelIzquierda.setLayout( new GridLayout( 1, 1 ) );
panelCentral.add( panelIzquierda, BorderLayout.WEST );
btnRetroceder = new JButton( RETROCEDER );
btnRetroceder.setActionCommand( RETROCEDER );
btnRetroceder.addActionListener( this );
panelIzquierda.add( btnRetroceder );
JPanel panelDerecha = new JPanel( );
panelDerecha.setBorder( new EmptyBorder( 5, 2, 0, 5 ) );
panelDerecha.setLayout( new GridLayout( 1, 1, 5, 5 ) );
panelCentral.add( panelDerecha, BorderLayout.EAST );
btnAvanzar = new JButton( AVANZAR );
btnAvanzar.setActionCommand( AVANZAR );
btnAvanzar.addActionListener( this );
panelDerecha.add( btnAvanzar );
}
// -----------------------------------------------------------------
// Métodos
// -----------------------------------------------------------------
/**
* Actualiza la información del panel con la pregunta especificada.
* @param pPregunta Pregunta con la información. pPregunta != null.
*/
public void actualizar( Pregunta pPregunta )
{
etiquetaNumero.setText( " " + Integer.toString( pPregunta.darNumero( ) ) + " " );
etiquetaTexto.setText( pPregunta.darTexto( ) );
etiquetaImagen.setIcon( new ImageIcon( new ImageIcon( pPregunta.darRutaImagen( ) ).getImage( ).getScaledInstance( 150, 100, Image.SCALE_DEFAULT ) ) );
char letraInicial = 'a';
String respuestas[] = pPregunta.darRespuestas( );
for( int i = 0; i < respuestas.length; i++ )
{
cajaRespuesta[ i ].setText( letraInicial + ". " + respuestas[ i ] );
cajaRespuesta[ i ].setEnabled( !pPregunta.guardada( ) );
cajaRespuesta[ i ].setSelected( respuestas[ i ].equals( pPregunta.darRespuestaSeleccionada( ) ) );
letraInicial++;
}
txtResultado.setText( pPregunta.darResultado( ) );
txtRespuestaUsuario.setText( pPregunta.darRespuestaSeleccionada( ) );
if( !pPregunta.guardada( ) )
{
txtPuntajeObtenido.setText( "" );
txtRespuestaCorrecta.setText( "" );
txtResultado.setBackground( null );
}
else
{
txtPuntajeObtenido.setText( pPregunta.darPuntaje( ) + "" );
txtRespuestaCorrecta.setText( pPregunta.darRespuestaCorrecta( ) );
if( pPregunta.respuestaCorrecta( ) )
{
txtResultado.setBackground( Color.GREEN );
}
else
{
txtResultado.setBackground( Color.RED );
}
}
btnGuardarRespuesta.setEnabled( !pPregunta.guardada( ) );
}
/**
* Manejo de los eventos de las respuestas.
* @param pEvento Acción que generó el evento. pEvento != null.estado
*/
public void itemStateChanged( ItemEvent pEvento )
{
int estado = pEvento.getStateChange( );
if( estado == 1 )
{
for( int i = 0; i < cajaRespuesta.length; i++ )
{
if( pEvento.getItem( ) != cajaRespuesta[ i ] )
{
cajaRespuesta[ i ].setSelected( false );
}
else
{
respuestaActual = cajaRespuesta[ i ].getText( ).substring( 3 ).trim( );
}
}
}
}
/**
* Manejo de los eventos de los botones.
* @param pEvento Acción que generó el evento. pEvento != null.
*/
public void actionPerformed( ActionEvent pEvento )
{
String comando = pEvento.getActionCommand( );
if( comando.equals( GUARDAR ) )
{
principal.guardarRespuesta( respuestaActual );
}
else if( RETROCEDER.equals( pEvento.getActionCommand( ) ) )
{
principal.retroceder( );
}
else if( AVANZAR.equals( pEvento.getActionCommand( ) ) )
{
principal.avanzar( );
}
else
{
boolean cambio = false;
limpiarRespuestas( );
for( int i = 0; i < cajaRespuesta.length && !cambio; i++ )
{
if( comando.equals( CAMBIAR_RESPUESTA + i ) )
{
cajaRespuesta[ i ].setSelected( true );
respuestaActual = cajaRespuesta[ i ].getText( ).substring( 3 ).trim( );
cambio = true;
}
}
}
}
/**
* Elimina todas las selecciones.
*/
public void limpiarRespuestas( )
{
for( int i = 0; i < cajaRespuesta.length; i++ )
{
cajaRespuesta[ i ].setSelected( false );
}
}
}
|