Lo que vas a encontrar...
Las Clases Anónimas en Java son un tipo de concepto bastante interesante, muchas veces útil a la hora de manejar determinados eventos. En esta oportunidad les mostrare un ejemplo de como usarlos en la configuración de la hora, minutos y segundos. Clickea si quieres saber mas sobre Clases Anónimas en Java 😉
Este ejemplo esta compuesto de dos clases, una llamada Tiempo y la otra ClaseInterna, esta ultima contiene la GUI, clases internas, clases anónimas y el método main.
Clase Tiempo
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 | / Declaración de la clase Tiempo con métodos establecer y obtener. import java.text.DecimalFormat; public class Tiempo{ private int hora; // 0 - 23 private int minuto; // 0 - 59 private int segundo; // 0 - 59 // un objeto de formato para compartir en toString y aStringUniversal private static DecimalFormat dosDigitos = new DecimalFormat( "00" ); // el constructor de Tiempo inicializa cada variable de instancia en cero; // se asegura que cada objeto Tiempo inicie en un estado consistente public Tiempo(){ this( 0, 0, 0 ); // invocar al constructor de Tiempo con tres argumentos } // constructor de Tiempo: se proporciona hora; minuto y segundo con valor predeterminado de 0 public Tiempo( int h ){ this( h, 0, 0 ); // invocar al constructor de Tiempo con tres argumentos } // constructor de Tiempo: se proporcionan hora y minuto, segundo con valor predeterminado de 0 public Tiempo( int h, int m ){ this( h, m, 0 ); // invocar al constructor de Tiempo con tres argumentos } // constructor de Tiempo: se proporcionan hora, minuto y segundo public Tiempo( int h, int m, int s ){ establecerTiempo( h, m, s ); } // constructor de Tiempo: se suministra otro objeto Tiempo3 public Tiempo( Tiempo tiempo ){ // invocar al constructor de Tiempo con tres argumentos this( tiempo.obtenerHora(), tiempo.obtenerMinuto(), tiempo.obtenerSegundo() ); } /******************* Métodos Establecer ó Set *******************/ // establecer un nuevo valor de tiempo, utilizando la hora universal; realizar // comprobaciones de validez en los datos; establecer valores inválidos en cero public void establecerTiempo( int h, int m, int s ){ establecerHora( h ); // establecer la hora establecerMinuto( m ); // establecer el minuto establecerSegundo( s ); // establecer el segundo } // validar y establecer hora public void establecerHora( int h ){ hora = ( ( h >= 0 && h < 24 ) ? h : 0 ); } // validar y establecer minuto public void establecerMinuto( int m ){ minuto = ( ( m >= 0 && m < 60 ) ? m : 0 ); } // validar y establecer segundo public void establecerSegundo( int s ){ segundo = ( ( s >= 0 && s < 60 ) ? s : 0 ); } /********* Métodos Obtener ó Get *************/ // obtener valor de hora public int obtenerHora(){ return hora; } // obtener valor de minuto public int obtenerMinuto(){ return minuto; } // obtener valor de segundo public int obtenerSegundo(){ return segundo; } // convertir a String en formato de hora universal public String aStringUniversal(){ return dosDigitos.format( obtenerHora() ) + ":" + dosDigitos.format( obtenerMinuto() ) + ":" + dosDigitos.format( obtenerSegundo() ); } // convertir a String en formato de hora estándar public String toString(){ return ( (obtenerHora() == 12 || obtenerHora() == 0 ) ? 12 : obtenerHora() % 12 ) + ":" + dosDigitos.format( obtenerMinuto() ) + ":" + dosDigitos.format( obtenerSegundo() ) + ( obtenerHora() < 12 ? " AM" : " PM" ); } } // fin de la clase Tiempo |
Clase Principal
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 | // Demostración de los métodos establecer y obtener de la clase Tiempo import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ClaseInterna extends JFrame { private Tiempo tiempo; private JLabel horaEtiqueta, minutoEtiqueta, segundoEtiqueta; private JTextField horaCampo, minutoCampo, segundoCampo, pantallaCampo; private JPanel contenedor; // constructor public ClaseInterna() { // llamar al constructor de JFrame para establecer cadena de barra de título super( "Demostración de clase interna anónima" ); tiempo = new Tiempo(); // crear objeto Tiempo crearGUI(); // configurar GUI super.add(this.contenedor); super.setResizable(false); registrarManejadoresDeEventos(); // configurar el manejo de eventos } // crear componentes de GUI y adjuntarlos al panel de contenido private void crearGUI(){ contenedor = new JPanel(); contenedor.setLayout(new BorderLayout()); JPanel contCampos = new JPanel(); contCampos.setLayout(new GridLayout(3, 2)); horaEtiqueta = new JLabel( "Ajuste hora" ); horaCampo = new JTextField( 10 ); minutoEtiqueta = new JLabel( "Ajuste minuto" ); minutoCampo = new JTextField( 10 ); segundoEtiqueta = new JLabel( "Ajuste segundo" ); segundoCampo = new JTextField( 10 ); pantallaCampo = new JTextField( 30 ); pantallaCampo.setEditable( false ); contCampos.add( horaEtiqueta); contCampos.add( horaCampo); contCampos.add( minutoEtiqueta); contCampos.add( minutoCampo); contCampos.add( segundoEtiqueta); contCampos.add( segundoCampo); contenedor.add(contCampos, BorderLayout.WEST); contenedor.add(pantallaCampo, BorderLayout.CENTER); contenedor.setSize(300, 250); } // fin del método crearGUI // registrar manejadores de eventos para horaCampo, minutoCampo y segundoCampo private void registrarManejadoresDeEventos(){ // registrar manejador de eventos para horaCampo horaCampo.addActionListener( new ActionListener() { // clase interna anónima public void actionPerformed( ActionEvent evento ) { tiempo.establecerHora( Integer.parseInt(evento.getActionCommand() ) ); horaCampo.setText( "" ); mostrarTiempo(); } } // fin de la clase interna anónima ); // fin de la llamada a addActionListener para horaCampo // registrar manejador de eventos para minutoCampo minutoCampo.addActionListener( new ActionListener() { // CLASE INTERNA ANONIMA public void actionPerformed( ActionEvent evento ){ tiempo.establecerMinuto( Integer.parseInt(evento.getActionCommand() ) ); minutoCampo.setText( "" ); mostrarTiempo(); } } // fin de la clase interna anónima ); // fin de la llamada a addActionListener para minutoCampo segundoCampo.addActionListener( new ActionListener() { // clase interna anónima public void actionPerformed( ActionEvent evento ) { tiempo.establecerSegundo( Integer.parseInt(evento.getActionCommand() ) ); segundoCampo.setText( "" ); mostrarTiempo(); } } // fin de la clase interna anónima ); // fin de la llamada a addActionListener para segundoCampo } // fin del método registrarManejadoresDeEventos // mostrar tiempo en pantallaCampo public void mostrarTiempo(){ pantallaCampo.setText( "La hora es: " + tiempo ); } // crear objeto VentanaPruebaTiempo2, registrarse para sus eventos de ventana // y mostrarlo para empezar la ejecución de la aplicación public static void main( String args[] ){ ClaseInterna ventana = new ClaseInterna(); // registrar componente de escucha para evento windowClosing ventana.addWindowListener( // clase interna anónima para evento windowClosing new WindowAdapter() { // terminar la aplicación cuando el usuario cierra la ventana public void windowClosing( WindowEvent evento ){ System.exit( 0 ); } } // fin de la clase interna anónima ); // fin de la llamada a addWindowListener para ventana ventana.setSize( 400, 120 ); ventana.setVisible( true ); } // fin de main } // fin de la clase ClaseInterna |
Son tres campos (horas, minutos, segundos), para cada campo existe una Clase Anónima, estas se encuentran en las lineas 59, 73, 88. Una vez ejecutado el ejemplo veremos lo siguiente:
Ojo!!! Lo números que aparecen en los campos de texto es por que una vez pulsado el evento he puesto aquellos valores, ya que si escribes algún numero entero y pulsas enter, el campo se limpia. Otro dato que debes de tener en cuenta es que los campos no están validados, en otras palabras puedes ingresar un caractér o una cadena de texto y te arrojara error en tiempo de ejecución, validalos 😉