> For the complete documentation index, see [llms.txt](https://educacion.gitbook.io/programacion/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://educacion.gitbook.io/programacion/ud5-entrada-e-saida-da-informacion/interfaces-graficas/programacion-orientada-a-eventos.md).

# Programación orientada a eventos

Os eventos son **accións que o usuario realiza ou que acontecen no sistema**, e permiten que a aplicación reaccione.\
En Java Swing, podemos detectar eventos e asociarlles accións mediante *listeners*.

**Exemplos:**

* **ActionEvent** → Un botón foi pulsado (`JButton.addActionListener`).
* **MouseEvent** → O usuario moveu ou clicou co rato (`MouseListener`).
* **KeyEvent** → O usuario presionou unha tecla (`KeyListener`).

{% @mermaid/diagram content="sequenceDiagram
participant Usuario
participant UI as Elemento UI (Botón)
participant Listener
participant App as Aplicación

```
Usuario->>UI: 1. Click/Touch
UI->>Listener: 2. Dispara evento
Listener->>App: 3. Ejecuta callback
App-->>UI: 4. Actualiza interfaz
UI-->>Usuario: 5. Feedback visual" %}
```

## Modelo de xestión de eventos

Cando un usuario interactúa cun compoñente da inteface (por exemplo, premendo un botón, movendo o rato ou pechando unha ventá), producese un evento:

1. O c**ompoñente que que recibe a acción** convirtese na **fonte do evento**
2. Este c**ompoñente fonte, non contén necesariamente o código que debe executarse como resposta,** simplemente detecta que algo aconteceu
3. O **evento xerado transmítese** a un obxecto chamado **listener ou escoitador**
4. O **listener** é o responsable de **reaccionar ante a acción producida**
5. Cando o **evento se produce, o listener recibe un obxecto de clase evento** (ActionEvent, MouseEvent, WindowEvent, KeyEvent,...)
6. O o**bxecto evento conten toda a información** para que o l**istener poida xestionar correctamente a situación**:
   1. Que compoñente xerou o evento
   2. Cando ocorreu o evento
   3. Que tipo de acción concreta se realizou

{% @mermaid/diagram content="classDiagram

```
class CompoñenteUI - ContenedorUI {
    -actionListeners: List~ActionListener~
    -mouseListeners: List~MouseListener~
    +addActionListener(ActionListener)
    +addMouseListener(MouseListener)
    +xerarEvento()
}

class ActionListener {
    <<interface>>
    +actionPerformed(e)
}

class MouseListener {
    <<interface>>
    +mouseClicked(e)
}

CompoñenteUI - ContenedorUI --> "0..*" ActionListener : notifica
CompoñenteUI - ContenedorUI --> "0..*" MouseListener : notifica

class ListenerConcreto {
    +actionPerformed(e)
    +mouseClicked(e)
}

ListenerConcreto ..|> ActionListener
ListenerConcreto ..|> MouseListener" %}
```

## Vantaxes do modelo de eventos

* Basease na separación entre xeración e xestión de eventos
  * O compoñente detecta que algo aconteceu
  * O Listener contén a lóxica da resposta
* A separación facilita a organización do programa e mellora a claridade do códig
* Permite a **modificación do comportamento sen alterar o compoñente gráfico**

## Interfaces Listener mais comúns

| Evento      | Interface Listener | Método de enlace    | Compoñentes típicos |
| ----------- | ------------------ | ------------------- | ------------------- |
| ActionEvent | ActionListener     | addActionListener() | JButton, JTextField |
| MouseEvent  | MouseListener      | addMouseListener()  | Calquera compoñente |
| KeyEvent    | KeyListener        | addKeyListener()    | Campos de texto     |
| WindowEvent | WindowListener     | addWindowListener() | JFrame, JDialog     |

{% hint style="info" %}
**Documentación oficial:** <https://docs.oracle.com/javase/8/docs/api/java/awt/event/ActionListener.html>
{% endhint %}

{% hint style="info" %}
**Documentación oficial:** <https://docs.oracle.com/javase/8/docs/api/java/awt/event/MouseListener.html>
{% endhint %}

{% hint style="info" %}
**Documentación oficial:** <https://docs.oracle.com/javase/8/docs/api/java/awt/event/KeyEvent.html>
{% endhint %}

{% hint style="info" %}
**Documentación oficial:** <https://docs.oracle.com/javase/8/docs/api/java/awt/event/WindowEvent.html>
{% endhint %}

## Escenario de xestión de eventos e de interfaces

```java
package EventosBasico;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.LocalDateTime;

public class PanelPersonalizado extends JPanel {

    private JButton botonEjemplo;

    public PanelPersonalizado(){
        this.botonEjemplo = new JButton("Boton de ejemplo");
        this.botonEjemplo.setEnabled(true);
        this.add(botonEjemplo);

        this.botonEjemplo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("El boton acaba de ser pulsado " + LocalDateTime.now());
            }
        });
    }

    public JButton getBotonEjemplo() {
        return botonEjemplo;
    }
}

```

```java
package EventosBasico;

import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class FramePersonalizado extends JFrame {

    private PanelPersonalizado panel;

    public FramePersonalizado(){
        this.setTitle("Nuestro Frame Principal");
        this.setSize(600,400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //Añadimos un Listener
        this.addWindowListener(new WindowListener() {
            @Override
            public void windowOpened(WindowEvent e) {
                System.out.println("Acaba de abrirse la ventana");
            }

            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("Acaba de cerrarse la ventana");
            }

            @Override
            public void windowClosed(WindowEvent e) {

            }

            @Override
            public void windowIconified(WindowEvent e) {

            }

            @Override
            public void windowDeiconified(WindowEvent e) {

            }

            @Override
            public void windowActivated(WindowEvent e) {

            }

            @Override
            public void windowDeactivated(WindowEvent e) {

            }
        });
        //Iniciamos el Panel
        this.panel = new PanelPersonalizado();
        this.add(panel);
        this.setVisible(true);
    }

    public PanelPersonalizado getPanel() {
        return panel;
    }
}

```

```java
package EventosBasico;

public class App {
    public static void main(String[] args) {
        FramePersonalizado frame = new FramePersonalizado();
    }
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://educacion.gitbook.io/programacion/ud5-entrada-e-saida-da-informacion/interfaces-graficas/programacion-orientada-a-eventos.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
