/**
* Proyecto: 9x05-Muestra letra DNI
* Fichero: DNIGrafico.java
* Fecha: 24/05/2012
*
* Licencia (CC) BY-NC-SA: giltesa.com
*
* http://francho.org/2009/04/13/java-calculadora-sencilla-en-modo-grafico
* http://www.javamexico.org/blogs/daniel/codigo_para_centrar_jframe
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DNIGrafico extends JFrame implements KeyListener
{
// PROPIEDADES:
private JPanel panelBotones; // Creamos una variable en el que insertaremos los botones.
private JTextField campoTexto; // También un campo de texto que hará de pantalla donde veremos los números y el resultado.
private static final long serialVersionUID = -3263949043600021146L;
// CONSTRUCTOR:
public DNIGrafico()
{
// Se crea la ventana:
super();
setSize(168, 100); // El tamaño de la ventana principal.
setTitle("DNI"); // El titulo de la ventana.
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // Para que cuando se cierre la ventana termine también el proceso.
setResizable(false); // Bloquea la ventana para no permitir que se pueda cambiar de tamaño.
JPanel ventana = (JPanel) this.getContentPane(); // ...
ventana.setLayout(new BorderLayout()); // "Se indica que va a ser la ventana/panel/contenedor principal"
// Se crean la pantalla (el campo de texto):
campoTexto = new JTextField("", 1); // Instancia un campo de texto vacio de una columna.
campoTexto.setFont(new Font("Arial", Font.BOLD, 25)); // Establece la fuente para el texto.
campoTexto.setBackground(Color.WHITE); // El color de fondo.
campoTexto.setEditable(false); // Hace que no se pueda escribir directamente sobre el campo (se capturan las teclas por eventos mas adelante)
ventana.add("North", campoTexto); // Se coloca el campo de texto en la parte superior de la ventana.
// Se crean los botones:
panelBotones = new JPanel();
panelBotones.setLayout(new GridLayout(1, 2)); // Una botonera de 1 fila y 2 columnas.
nuevoBoton("Calcular"); // Se llama al metodo privado que creara el boton.
nuevoBoton("Borrar");
ventana.add("East", panelBotones); // Se añade la botonera a la parte inferior. // Revisar Con "South" no consigo poner los botones de un tamaño mayor mediante boton.setsize()
campoTexto.addKeyListener(this); // Permite que la ventana pueda detectar pulsaciones del teclado.
centrarVentana(); // Centra la ventana en el monitor del pc.
validate(); // ...
}
// METODOS:
// Crea un nuevo botón y después lo añade al panelBotones:
private void nuevoBoton( String nombreBoton )
{
JButton boton = new JButton(nombreBoton); // Se instancia el nuevo botón con el nombre recibido por valor.
boton.addMouseListener(new MouseAdapter() // Al botón se le va a agregar la detección de eventos mediante el ratón, así se podrá saber si es pulsado el botón.
{
public void mouseReleased( MouseEvent evento )
{
JButton boton = (JButton) evento.getSource(); // Cuando suceda un evento se recoge el botón que lo produjo.
operacion(boton.getText()); // y se envía el texto del botón a operacion()
campoTexto.requestFocus(); // Mantiene el foco en el campo de texto después de pulsar el botón.
}
});
panelBotones.add(boton); // Por ultimo se agrega el botón al panel de botones.
}
// Realiza la operación para calcular la letra del DNI:
private void operacion( String nombreTecla )
{
int dni;
char letra;
String letras = new String("TRWAGMYFPDXBNJZSQVHLCKE");
char ultCarCampoTexto;
int numCarCampoTexto;
// Es necesario, además de ejecutar el evento Calcular, que el campo de texto contenga números.
if( !campoTexto.getText().isEmpty() && nombreTecla.equals("Calcular") )
{
numCarCampoTexto = campoTexto.getText().length();
ultCarCampoTexto = campoTexto.getText().charAt(numCarCampoTexto - 1);
// Además de la longitud del dni, hay que comprobar que no se pueda añadir mas números al campo de
// texto si previamente se calculo la letra, ya que podría dar como resultado esto: "123Z25" = Error.
if( numCarCampoTexto <= 8 && ultCarCampoTexto >= '0' && ultCarCampoTexto <= '9' )
{
dni = Integer.parseInt(campoTexto.getText());
letra = letras.charAt(dni % 23);
campoTexto.setText("" + dni + letra);
}
}
else
campoTexto.setText("");
}
// Al implementar la interfaz KeyListener es obligatorio tener los tres métodos que actúan ante los eventos del teclado.
// en este caso solo se usa el evento que actúa cuando se deja de pulsar la tecla.
public void keyTyped( KeyEvent evento ){}
public void keyPressed( KeyEvent evento ){}
public void keyReleased( KeyEvent evento )
{
int codCaracter = evento.getKeyCode();
char charCaracter = evento.getKeyChar();
int numCarCampoTexto = campoTexto.getText().length();
char ultCaracter = '0';
if( numCarCampoTexto != 0 )
ultCaracter = campoTexto.getText().charAt(numCarCampoTexto - 1);
if( charCaracter >= '0' && charCaracter <= '9' && numCarCampoTexto < 8 && ultCaracter >= '0' && ultCaracter <= '9' )
campoTexto.setText(campoTexto.getText() + evento.getKeyChar());
else if( codCaracter == 10 )
operacion("Calcular");
else if( codCaracter == 8 && campoTexto.getText().length() != 0 )
campoTexto.setText(campoTexto.getText().substring(0, campoTexto.getText().length() - 1));
}
// Este método se encarga de centrar la ventana principal:
private void centrarVentana()
{
Dimension pantalla = Toolkit.getDefaultToolkit().getScreenSize(); // Se obtienen las dimensiones en píxels de la pantalla.
Dimension ventana = getSize(); // Se obtienen las dimensiones en píxels de la ventana.
setLocation((pantalla.width - ventana.width) / 2, (pantalla.height - ventana.height) / 2); // Una cuenta para situar la ventana en el centro de la pantalla.
}
}