1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
/** * 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. } } |