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


