Foro de elhacker.net

Programación => Java => Mensaje iniciado por: NextByte en 25 Marzo 2019, 00:07 am



Título: Diferentes formas de manejar eventos en java.
Publicado por: NextByte en 25 Marzo 2019, 00:07 am
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
  1. import java.awt.*;
  2. import java.awt.Color;
  3. import java.awt.event.*;
  4. import javax.swing.*;
  5.  
  6. public class Manejo{
  7.    public static void main(String[] args) {
  8.        Ventana v1 = new Ventana(new Dimension(400,400));
  9.        v1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  10.    }
  11.  
  12.  
  13. }
  14.  
  15.  
  16. class Ventana extends JFrame{
  17.    Lamina l1;
  18.    public Ventana(Dimension d){
  19.        setSize(d);
  20.        l1 = new Lamina();
  21.        add(l1);
  22.        setVisible(true);
  23.    }
  24.  
  25.  
  26. }
  27.  
  28. class Lamina extends JPanel implements ActionListener{
  29.    private JButton verde;
  30.    private JButton azul;
  31.    private JButton amarillo;
  32.    private Color fondo;
  33.  
  34.    public Lamina(){
  35.        verde = new JButton("Color verde");
  36.        azul = new JButton("Color azul");
  37.        amarillo = new JButton("Color amarillo");
  38.  
  39.        verde.addActionListener(this);
  40.        azul.addActionListener(this);
  41.        amarillo.addActionListener(this);
  42.        add(verde);
  43.        add(azul);
  44.        add(amarillo);
  45.    }
  46.  
  47.    @Override
  48.    public void actionPerformed(ActionEvent e){
  49.        Object fuente = e.getSource();
  50.  
  51.        if(fuente  == verde){
  52.            fondo = Color.GREEN;
  53.            setBackground(fondo);
  54.  
  55.        }else if( fuente == azul){
  56.            fondo = Color.BLUE;
  57.            setBackground(fondo);
  58.  
  59.        }else{
  60.            fondo = Color.YELLOW;
  61.            setBackground(fondo);
  62.  
  63.        }
  64.    }
  65.  
  66. }

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

Código
  1. import java.awt.*;
  2. import java.awt.Color;
  3. import java.awt.event.*;
  4. import javax.swing.*;
  5.  
  6. public class Manejo{
  7.    public static void main(String[] args) {
  8.        Ventana v1 = new Ventana(new Dimension(400,400));
  9.        v1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  10.    }  
  11. }
  12.  
  13.  
  14. class Ventana extends JFrame{
  15.    Lamina l1;
  16.    public Ventana(Dimension d){
  17.        setSize(d);
  18.        l1 = new Lamina();
  19.        add(l1);
  20.        setVisible(true);
  21.    }
  22.  
  23.  
  24. }
  25.  
  26. class Lamina extends JPanel {
  27.    private JButton verde;
  28.    private JButton azul;
  29.    private JButton amarillo;
  30.    private Color fondo;
  31.  
  32.    public Lamina(){
  33.        verde = new JButton("Color verde");
  34.        azul = new JButton("Color azul");
  35.        amarillo = new JButton("Color amarillo");
  36.  
  37.        verde.addActionListener(new ColorFondo(Color.GREEN));
  38.        azul.addActionListener(new ColorFondo(Color.BLUE));
  39.        amarillo.addActionListener(new ColorFondo(Color.YELLOW));
  40.  
  41.        add(verde);
  42.        add(azul);
  43.        add(amarillo);
  44.    }
  45.  
  46.  
  47.    private class ColorFondo implements ActionListener{
  48.        private Color c;
  49.  
  50.        public ColorFondo(Color c){
  51.            this.c = c;
  52.        }
  53.  
  54.        @Override
  55.        public void actionPerformed(ActionEvent e){
  56.            setBackground(c);
  57.        }
  58.  
  59.    }
  60.  
  61. }
  62.  


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.




Título: Re: Diferentes formas de manejar eventos en java.
Publicado por: 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
  1. final JButton button = new JButton("Click Me!");
  2. button.addActionListener(e -> {
  3. JOptionPane.showMessageDialog(null,"Click");
  4. });
  5.  


Título: Re: Diferentes formas de manejar eventos en java.
Publicado por: NextByte en 25 Marzo 2019, 00:15 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
  1. final JButton button = new JButton("Click Me!");
  2. button.addActionListener(e -> {
  3. JOptionPane.showMessageDialog(null,"Click");
  4. });
  5.  

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.