Diferentes formas de manejar eventos en java.

Iniciado por NextByte, 25 Marzo 2019, 00:07 AM

0 Miembros y 1 Visitante están viendo este tema.

NextByte

Buenas a todos , tenía la curiosidad sobre saber cual era su forma de organizar las clases destinadas a las interfaces gráficas y en especifico como administraban el objeto que respondía a los eventos.

Actualmente he visto 2 formas muy particulares de hacerlo y que las mostrare con un ejemplo sencillo que tiene 3 botones, cada botón hace referencia a un color y cuando se da clic en alguno de ellos simplemente el panel se pinta de dicho color.

1ra Forma. El panel al ser el objeto que va ser afectado por el evento es el que implementa la interfaz ActionListener.

Código (java) [Seleccionar]

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

public class Manejo{
   public static void main(String[] args) {
       Ventana v1 = new Ventana(new Dimension(400,400));
       v1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }
   
   
}


class Ventana extends JFrame{
   Lamina l1;
   public Ventana(Dimension d){
       setSize(d);
       l1 = new Lamina();
       add(l1);
       setVisible(true);
   }

   
}

class Lamina extends JPanel implements ActionListener{
   private JButton verde;
   private JButton azul;
   private JButton amarillo;
   private Color fondo;

   public Lamina(){
       verde = new JButton("Color verde");
       azul = new JButton("Color azul");
       amarillo = new JButton("Color amarillo");

       verde.addActionListener(this);
       azul.addActionListener(this);
       amarillo.addActionListener(this);
       add(verde);
       add(azul);
       add(amarillo);
   }

   @Override
   public void actionPerformed(ActionEvent e){
       Object fuente = e.getSource();

       if(fuente  == verde){
           fondo = Color.GREEN;
           setBackground(fondo);
           
       }else if( fuente == azul){
           fondo = Color.BLUE;
           setBackground(fondo);

       }else{
           fondo = Color.YELLOW;
           setBackground(fondo);

       }
   }

}


2da Forma. Se crea una clase anidada que controla el evento e implementa la interfaz actionListener .

Código (java) [Seleccionar]

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

public class Manejo{
   public static void main(String[] args) {
       Ventana v1 = new Ventana(new Dimension(400,400));
       v1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }  
}


class Ventana extends JFrame{
   Lamina l1;
   public Ventana(Dimension d){
       setSize(d);
       l1 = new Lamina();
       add(l1);
       setVisible(true);
   }

   
}

class Lamina extends JPanel {
   private JButton verde;
   private JButton azul;
   private JButton amarillo;
   private Color fondo;

   public Lamina(){
       verde = new JButton("Color verde");
       azul = new JButton("Color azul");
       amarillo = new JButton("Color amarillo");

       verde.addActionListener(new ColorFondo(Color.GREEN));
       azul.addActionListener(new ColorFondo(Color.BLUE));
       amarillo.addActionListener(new ColorFondo(Color.YELLOW));

       add(verde);
       add(azul);
       add(amarillo);
   }


   private class ColorFondo implements ActionListener{
       private Color c;
   
       public ColorFondo(Color c){
           this.c = c;
       }
   
       @Override
       public void actionPerformed(ActionEvent e){
           setBackground(c);
       }
       
   }

}



A partir de las anteriores formas de dar solución al problema me causa la incógnita el saber cual podría ser la mejor forma de hacerlo, personalmente no encuentro mucha diferencia para inclinarme hacia un lado pero me gustaría saber si alguien pudiera compartir su experiencia y explicar cual prefiere y la razón del por que.



rub'n

otra es por medio de clases internas anónimas, para no llenar tu clase con implementacion de interfaces

Ejemplo con una expresión lambda, mínimo java 8 debes tener.

Código (java) [Seleccionar]

final JButton button = new JButton("Click Me!");
button.addActionListener(e -> {
JOptionPane.showMessageDialog(null,"Click");
});


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

NextByte

Cita de: rub'n en 25 Marzo 2019, 00:12 AM
otra es por medio de clases internas anónimas, para no llenar tu clase con implementacion de interfaces

Ejemplo con una expresión lambda, mínimo java 8 debes tener.

Código (java) [Seleccionar]

final JButton button = new JButton("Click Me!");
button.addActionListener(e -> {
JOptionPane.showMessageDialog(null,"Click");
});


Ya veo , parece ser una forma muy limpia de hacerlo, aún no he tocado el tema de las expresiones lambda pero veo que es muy similar a la forma en que se hace esta tarea en javascript.