Realizar una acción al pulsar un botón

Las aplicaciones han de responder a las acciones que realiza el usuario, por ejemplo: cerrar la ventana al pulsar un botón. Es necesario poder detectar las acciones de usuario y convertirlas en acciones de programa. Java dispone de varias formas de implementar este funcionamiento. En este ejercicio se mostrarán algunas de ellas. Todas se basan en este mecanismo básico:



/* CAPTURA DE EVENTOS DE ACCIÓN USANDO 
* CLASES DERIVADAS DE LA INTERFAZ ActionListener Y EVENTOS DE TIPO ActionEvent.
* ActionListener GENERA EVENTOS ActionEvent CUANDO OCURRE UNA ACCIÓN SOBRE EL ELEMENTO
* Y MEDIANTE SU MÉTODO ActionPerformed(ActionEvent e) REALIZA LAS ACCIONES PREVISTAS */


import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

// CLASE PRINCIPAL DEL PROGRAMA (implementa ActionListener)
public class Action_listener extends JFrame implements ActionListener {

// variables a nivel de clase
private JLabel contador;
private JButton bt1, bt2, bt3, bt4, bt5, bt6;
private int cuenta = 0;
private JPanel p1, p2;

// MÉTODO DE ENTRADA AL PROGRAMA
public static void main(String[] args) {
// instancia de la clase principal
new Action_listener();
}

// MÉTODO CONSTRUCTOR QUE CREA Y MUESTRA LA INTERFAZ
public Action_listener() {
// decoración de Java
JFrame.setDefaultLookAndFeelDecorated(true);

/* la variable especial this se usa en métodos de instancia
* para hacer referencia al objeto que contiene al método,
* aquí equivale a JFrame */


// acción por defecto al cerrar la ventana: salir del programa
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

/* paneles de disposición: por defecto, los paneles se crean con diseño FlowLayout
* por ello es preferible definir el Layout en el constructor del panel, para crearlo
* desde el principio con ese diseño y evitar la creación de un FlowLayout temporal;
* es preferible hacer:
* p1 = new JPanel(new BorderLayout());
* mejor que hacer ésto otro:
* p1 = new JPanel();
* p1.setLayout(new BorderLayout()); */

p1 = new JPanel(new BorderLayout());
// borde del panel: vacío, 10px por cada lado
p1.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
// panel para ocupar BorderLayout.SOUTH
p2 = new JPanel();
p2.setLayout(new GridLayout(1,4,10,10));

// configurar fuente y convertir número a String para JLabel
contador = new JLabel(Integer.toString(cuenta), JLabel.CENTER);
Font letra1 = new Font("Arial", Font.BOLD, 12);
contador.setFont(letra1);
// configurar fuente para los botones
Font letra2 = new Font("Arial", Font.PLAIN, 12);
bt1 = new JButton("De 1 en 1");
bt1.setFont(letra2);
bt2 = new JButton("De 2 en 2");
bt2.setFont(letra2);
bt3 = new JButton("De 3 en 3");
bt3.setFont(letra2);
bt4 = new JButton("De 4 en 4");
bt4.setFont(letra2);

// tooltips para los botones
bt1.setToolTipText("Contar de 1 en 1");
bt2.setToolTipText("Contar de 2 en 2");
bt3.setToolTipText("Contar de 3 en 3");
bt4.setToolTipText("Contar de 4 en 4");

/* acción por defecto ante los eventos de bt1 y bt3,
* para poder diferenciar más tarde cuál de los 2 botones
* ha generado el evento */

bt1.setActionCommand ("Contar1");
bt3.setActionCommand ("Contar3");

/*colocar los componentes en los paneles;
* para añadir un componente a un JFrame es preferible
* frame.getContentPane().add(p1);
* en lugar de
* frame.add(p1);*/

this.getContentPane().add(p1);
p1.add(contador, BorderLayout.NORTH);
p1.add(p2, BorderLayout.SOUTH);
p2.add(bt1);
p2.add(bt2);
p2.add(bt3);
p2.add(bt4);

// crear y mostrar la ventana
this.setTitle("ActionListener");
this.setSize(500,100);
this.setLocationRelativeTo(null); // centrar el formulario en la pantalla
this.setResizable(false);
this.setVisible(true);

/*la clase principal implementa la interfaz ActionListener
* por ello se pueden emplear sus métodos directamente.
* aquí se detectan las acciones sobre los botones bt1 y bt3: */

bt1.addActionListener(this);
bt3.addActionListener(this);

/*Botón bt2: se asocia con una instancia de la clase Contar,
* la clase Contar también implementa ActionListener por lo que
* este método podría usarse aunque la clase principal no fuese ActionListener */

bt2.addActionListener(new Contar());

/* si la clase principal no implementa la interfaz ActionListener
* se puede asociar el botón con una instancia de ActionListener;
* su método actionPerformed() enlaza con el método clicEnBoton2() que
* se ejecuta cuando se detectan acciones sobre el botón */

bt4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
clicEnBoton2(e); }
});

}

// LO QUE SUCEDE AL PULSAR LOS BOTONES 1 y 3
public void actionPerformed(ActionEvent e) {
// si se ha pulsado en el botón bt1 (si ActionCommand es Contar1)
if ("Contar1".equals(e.getActionCommand())) {
cuenta ++; // contar 1
contador.setText(Integer.toString(cuenta)); }
// si se ha pulsado en el botón bt3 (si ActionCommand es Contar3)
else if ("Contar3".equals(e.getActionCommand())) {
cuenta +=3; // contar 3
contador.setText(Integer.toString(cuenta)); }
}

// LO QUE SUCEDE AL PULSAR EL BOTON 2
class Contar implements ActionListener {
public void actionPerformed(ActionEvent evt) {
cuenta +=2; // contar 3
contador.setText(Integer.toString(cuenta)); }
}

// LO QUE SUCEDE AL PULSAR EL BOTON 4
private void clicEnBoton2(ActionEvent evt) {
cuenta +=4; // contar 4
contador.setText(Integer.toString(cuenta));
}

}

2 comentarios:

Bridaroga dijo...

Muy bueno, me ayudó mucho en un trabajo. Gracias.

ingles dijo...

gracias por el codigo, me ayudo con un trabajo