Ver Mensaje Individual
  #12 (permalink)  
Antiguo 18/12/2007, 13:09
ARAPSPGON
 
Fecha de Ingreso: octubre-2007
Mensajes: 57
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Duda principiante funcion (THIS) java

Aplicación de ejemplo

Se trata de una ventana con una etiqueta para mostrar un número y 4 botones de comando; cada botón,al ser pulsado, implementa la acción de forma diferente, según lo referido más arriba; todos ellos suman una cifra al número mostrado.

codigo fuente


Código:
/* 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));
   }

}