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 |
/ 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 |
// 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 😉