Está en la página 1de 9

public class Trigo extends JFrame implements ActionListener

El hecho de afirmar que la clase "Trigo" implementa la interfaz "ActionListener" implica que ahora esta clase contiene todos los mtodos definidos en la interfaz. Cabe recordar que todos los mtodos de una interfaz son abstractos por lo tanto o sobre-escribimos los mtodos agregandoles un cuerpo o bien tendremos que declarar a nuestra clase "Trigo" como abstracta. Como en nuestro ejemplo no deseamos que nuestra clase "Trigo" sea abstracta implementaremos todos los mtodos de la interfaz "ActionListener". Afortunadamente, esta interfaz slo define un mtodo:

public void actionPerformed(ActionEvent e)

Este ser el mtodo que autmaticamente ser ejecutado cuando el botn le avise de su evento a la ventana. Para fines de este ejemplo deseamos que la accin a realizar cuando se oprima el botn sea que en el campo de texto aparezca un letrero en que se diga cuantas veces ha sido oprimido el botn. Por lo tanto incluiremos una nueva variable (para contar el nmero de clicks sobre el botn, linea 8), el mtodo "actionPerformed" (de la linea 18 a la 21) y cambiaremos la deficinicin de la clase (linea 5). Ademas de registrar a la ventana como oyente de los eventos del botn (linea 12). Quedando por lo tanto nuestra clase como:

1 import javax.swing.*; 2 import java.awt.*; 3 import java.awt.event.*; 4 5 public class Trigo extends JFrame implements ActionListener{ 6 private JButton b1; 7 private JTextField campo1; 8 private int numClicks = 0; 9

10 public Trigo(){ 11 12 13 14 15 b1 = new JButton("seno"); b1.addActionListener(this); campo1 = new JTextField(); this.getContentPane().add(b1,BorderLayout.NORTH); this.getContentPane().add(campo1,BorderLayout.SOUTH);

16 } 17 18 public void actionPerformed(ActionEvent e){ 19 20 numClicks++; campo1.setText(numClicks+"");

21 } 22 23 public static void main(String[] arg){ 24 25 26 27 Trigo miAplicacion = new Trigo(); miAplicacion.setBounds(10,10,200,200); miAplicacion.pack(); miAplicacion.setVisible(true);

28 } 29 }

Prueba ahora dando clicks al botn. Armando la calculadora

El ejemplo anterior sirve para mostrar los conceptos bsicos, pero la promesa era hacer una calculadora de funciones trigonometricas. El primer paso que realizaremos ser modificar un poco la interfaz, dejaremos el TextField como

medio de entrada para el ngulo del que deseamos saber el seno, y aadiremos otro TextField para reportar el resultado del clculo realizado. Tambien incluiremos unas etiquetas para marcar la entrada y salida de nuestra calculadora. Eliminaremos la variable que cuenta los clicks y para mostrar que los Paneles pueden contener otros paneles utilizaremos un par de paneles para ir organizando nuestra interfaz.

1 import javax.swing.*; 2 import java.awt.*; 3 import java.awt.event.*; 4 5 public class Trigo extends JFrame implements ActionListener{ 6 private JButton b1; 7 private JTextField campo1; 8 private JTextField campo2; 9 private JLabel etq1; 10 private JLabel etq2; 11 private Panel panelEntrada, panelSalida; 12 private JPanel panelDeLaVentana; 13 14 public Trigo(){ 15 16 17 18 19 20 21 //Creamos las etiquetas //Registramos a la ventana como oyente b1.addActionListener(this); //Creamos el boton b1 = new JButton("seno");

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

etq1 = new JLabel("Angulo: "); etq2 = new JLabel("Resultado: ");

//Creamos los campos de Texto campo1 = new JTextField(); campo2 = new JTextField();

//Cambiamos la propiedades de los TextFields campo2.setEditable(false); campo2.setColumns(10); campo2.setBackground(Color.lightGray); campo1.setColumns(10);

//Creamos los paneles auxiliares panelEntrada = new Panel(); panelSalida = new Panel();

//Obtenemos la referencia al panel principal panelDeLaVentana = (JPanel)this.getContentPane();

//Agregamos los componentes del panel de entrada panelEntrada.add(campo1,BoxLayout.X_AXIS); panelEntrada.add(etq1,BoxLayout.X_AXIS);

//Agregamos los componentes del panel de salida panelSalida.add(campo2,BoxLayout.X_AXIS);

48 49 50 51 52 53

panelSalida.add(etq2,BoxLayout.X_AXIS);

//Agregamos todo al panel Principal panelDeLaVentana.add(panelEntrada,BorderLayout.NORTH); panelDeLaVentana.add(b1,BorderLayout.CENTER); panelDeLaVentana.add(panelSalida,BorderLayout.SOUTH);

54 } 55 56 public void actionPerformed(ActionEvent e){ 57 } 58 59 public static void main(String[] arg){ 60 61 62 63 Trigo miAplicacion = new Trigo(); miAplicacion.setBounds(10,10,200,200); miAplicacion.pack(); miAplicacion.setVisible(true);

64 } 65 }

Ahora despues de compilar y ejecutar tendremos:

Figura 5

En la discusin anterior habiamos mencionado que un "BorderLayout" slo te permite poner una sola cosa en cada una de las regiones. Esta regla se sigue cumpliendo, el "BorderLayout" del panel principal contiene una sola cosa en la region Norte (linea 51); contiene el Panel llamado "panelEntrada", es este panel el que a su vez contiene dos cosas una etiqueta y un campo de texto

(lineas 43 y 44) utilizando su propia lgica para la disposicin de los elementos, en este caso utilizando un BoxLayout. Para la parte de la salida es algo similar, pero observe adems que la regin del centro del panel principal "panelDeLaVentana" esta ocupada por el botn. De nueva cuenta una vez con la interfaz organizada procederemos a darle funcionalidad al botn. Parte del trabajo ya est hecho:

La ventana ya es un "ActionListener" (implementa la interfaz "ActionListener") El botn ya registra a la venta como oyente de eventos (linea 19) La clase "Trigo" ya tiene un mtodo "actionPerformed", aunque vaco

Por lo tanto slo nos falta esribir la lgica de ejecucin para responder al evento del botn. Lo que deseamos ahora ejecutar como respuesta al evento puede resumirse en 3 sencillos pasos:

Leer el ngulo proporcionado en el "TextField" de entrada (campo1). Calcular el seno del ngulo proporcionado Escribir el resultado en el campo de texto correspondiente (campo2)

Al observar la API podemos darnos cuenta que entre el hecho de leer la entrada y calcular el seno hay un paso adicional, porque el "TextField" reporta su contenido como un "String" mientras que la funcin para calcular el seno, definida en el paquete Math de Java, utiliza un "double" como entrada. Por lo tanto, tendremos que convertir la cadena de caracteres en un double para despus calcular el seno. Para realizar esta conversin utilizaremos el mtodo "parseDouble" definido en la "Wrapper class" Double. Double.parseDouble(String val)

Agregando estas modificaciones el cdigo queda como:

1 import javax.swing.*; 2 import java.awt.*; 3 import java.awt.event.*; 4 5 public class Trigo extends JFrame implements ActionListener{ 6 private JButton b1; 7 private JTextField campo1; 8 private JTextField campo2; 9 private JLabel etq1; 10 private JLabel etq2; 11 private Panel panelEntrada, panelSalida; 12 private JPanel panelDeLaVentana; 13 14 public Trigo(){ 15 16 17 18 19 20 21 22 23 24 25 26 //Creamos los campos de Texto campo1 = new JTextField(); //Creamos las etiquetas etq1 = new JLabel("Angulo: "); etq2 = new JLabel("Resultado: "); //Registramos a la ventana como oyente b1.addActionListener(this); //Creamos el boton b1 = new JButton("seno");

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

campo2 = new JTextField();

//Cambiamos la propiedades de los TextFields campo2.setEditable(false); campo2.setColumns(10); campo2.setBackground(Color.lightGray); campo1.setColumns(10);

//Creamos los paneles auxiliares panelEntrada = new Panel(); panelSalida = new Panel();

//Obtenemos la referencia al panel principal panelDeLaVentana = (JPanel)this.getContentPane();

//Agregamos los componentes del panel de entrada panelEntrada.add(campo1,BoxLayout.X_AXIS); panelEntrada.add(etq1,BoxLayout.X_AXIS);

//Agregamos los componentes del panel de salida panelSalida.add(campo2,BoxLayout.X_AXIS); panelSalida.add(etq2,BoxLayout.X_AXIS);

//Agregamos todo al panel Principal panelDeLaVentana.add(panelEntrada,BorderLayout.NORTH); panelDeLaVentana.add(b1,BorderLayout.CENTER);

53

panelDeLaVentana.add(panelSalida,BorderLayout.SOUTH);

54 } 55 56 public void actionPerformed(ActionEvent e){ 57 58 59 double angulo = Double.parseDouble(campo1.getText()); double resultado = Math.sin(angulo); campo2.setText(resultado+"");

60 } 61 62 public static void main(String[] arg){ 63 64 65 66 Trigo miAplicacion = new Trigo(); miAplicacion.setBounds(10,10,200,200); miAplicacion.pack(); miAplicacion.setVisible(true);

67 } 68 }

Es hora de probar la calculadora, pero no hay que olvidar que de acuerdo a la API, la funcin seno de la clase Math asume que el valor representa un ngulo en radianes.

También podría gustarte