> 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/exemplo-de-interface-grafica-para-xestion-de-persoas/ventanaprincipal.md).

# VentanaPrincipal

Imos a crear unha clase VentanaPrincipal que imos estructurar en tres seccións:

* Panel Superior: Conten un encabezado para a ventá
* Panel Central: Conten unha taboa que representa unha lista de persoas
* Panel Inferior: Conten un botón que nos vai a permitir engadir persoas

Para isto imos a partir do código que xa vimos na parte de contendores:

```java
package InterfacesPersona;

import javax.swing.*;

public class VentanaPrincipal extends JFrame {

    private JPanel panelSuperior;
    private JPanel panelCentro;
    private JPanel panelInferior;

    public VentanaPrincipal(){
        setTitle("Gestión de Personas");
        setSize(600,400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        this.panelSuperior = new JPanel();
        this.panelCentro = new JPanel();
        this.panelInferior = new JPanel();

        panelSuperior.setBackground(Color.GREEN);
        panelCentro.setBackground(Color.YELLOW);
        panelInferior.setBackground(Color.CYAN);
        //Dimensiones
        panelSuperior.setPreferredSize(new Dimension(600, 80));
        panelInferior.setPreferredSize(new Dimension(600, 60));
        //Añadimos los paneles al frame
        this.add(panelSuperior, BorderLayout.NORTH);
        this.add(panelCentro, BorderLayout.CENTER);
        this.add(panelInferior, BorderLayout.SOUTH);

        setVisible(true);
    }
}
```

```java
package InterfacesPersona;

public class App {

    public static void main(String[] args) {
        VentanaPrincipal ventana = new VentanaPrincipal();
    }
}

```

### Panel Superior

O panel superior vai a conter unicamente un componente tipo JLabel co texto "Listado de Personas". Para isto, o primeiro que imos a facer é crear unha clase PanelSuperior que extende de JPanel

```java
package InterfacesPersona;

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

public class PanelSuperior extends JPanel {

    public PanelSuperior() {
        setLayout(new GridBagLayout()); //este Grid centra automaticamente

        JLabel lblTitulo = new JLabel("Listado de Personas");
        lblTitulo.setFont(new Font("Arial", Font.BOLD, 40));

        add(lblTitulo);
    }
}
```

Posteriormente imos a reemplazar na nosa VentanaPrincipal o compoñente:

```java
package InterfacesPersona;

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

public class VentanaPrincipal extends JFrame {

    private PanelSuperior panelSuperior;
    private JPanel panelCentro;
    private JPanel panelInferior;

    public VentanaPrincipal(){
        setTitle("Gestión de Personas");
        setSize(600,400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        this.panelSuperior = new PanelSuperior();
        this.panelCentro = new JPanel();
        this.panelInferior = new JPanel();

        panelSuperior.setBackground(Color.GREEN);
        panelCentro.setBackground(Color.YELLOW);
        panelInferior.setBackground(Color.CYAN);
        //Dimensiones
        panelSuperior.setPreferredSize(new Dimension(600, 80));
        panelInferior.setPreferredSize(new Dimension(600, 60));
        //Añadimos los paneles al frame
        this.add(panelSuperior, BorderLayout.NORTH);
        this.add(panelCentro, BorderLayout.CENTER);
        this.add(panelInferior, BorderLayout.SOUTH);

        setVisible(true);
    }
}
```

### Panel Inferior

O panel inferior vai a conter únicamente un boton "Añadir Persona" que vai a permitir engadir unha persoa no listado de persoas.

```java
package InterfacesPersona;

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

public class PanelInferior extends JPanel {

    private JButton btnNuevaPersona;

    public PanelInferior() {

        setLayout(new FlowLayout(FlowLayout.RIGHT));

        btnNuevaPersona = new JButton("Nueva Persona");

        add(btnNuevaPersona);
    }

    public JButton getBtnNuevaPersona() {
        return btnNuevaPersona;
    }
}

```

Posteriormente imos a reemplazar na nosa VentanaPrincipal o compoñente:

```java
package InterfacesPersona;

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

public class VentanaPrincipal extends JFrame {

    private PanelSuperior panelSuperior;
    private JPanel panelCentro;
    private PanelInferior panelInferior;

    public VentanaPrincipal(){
        setTitle("Gestión de Personas");
        setSize(600,400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        this.panelSuperior = new PanelSuperior();
        this.panelCentro = new JPanel();
        this.panelInferior = new PanelInferior();

        panelSuperior.setBackground(Color.GREEN);
        panelCentro.setBackground(Color.YELLOW);
        panelInferior.setBackground(Color.CYAN);
        //Dimensiones
        panelSuperior.setPreferredSize(new Dimension(600, 80));
        panelInferior.setPreferredSize(new Dimension(600, 60));
        //Añadimos los paneles al frame
        this.add(panelSuperior, BorderLayout.NORTH);
        this.add(panelCentro, BorderLayout.CENTER);
        this.add(panelInferior, BorderLayout.SOUTH);

        setVisible(true);
    }
}

```

### Panel Central

O panel central vai a conter unha taboa que vai a mostrar un listado de persoas. Para cada persoa imos a mostrar un nome, uns apelidos, unha data de nacemento e unha cidade

```java
package vista;

import modelo.Persona;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;

public class PanelCentral extends JPanel {

    private JTable tabla;
    private DefaultTableModel modelo;

    public PanelCentral(){
        setLayout(new BorderLayout());

        String[] columnas = {"Nombre", "Apellidos", "Fecha Nacimiento", "Ciudad"};

        modelo = new DefaultTableModel(columnas, 0);

        tabla = new JTable(modelo);

        add(new JScrollPane(tabla), BorderLayout.CENTER);
    }

    public void añadirPersona(Persona persona) {
        modelo.addRow(new Object[]{
                persona.getNombre(),
                persona.getApellidos(),
                persona.getFechaNacimiento(),
                persona.getCiudad()
        });
    }
}
```

Posteriormente imos a reemplazar na nosa VentanaPrincipal o compoñente:

```java
package vista;

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

public class VentanaPrincipal extends JFrame {

    private PanelSuperior panelSuperior;
    private PanelCentral panelCentro;
    private PanelInferior panelInferior;

    public VentanaPrincipal(){
        setTitle("Gestión de Personas");
        setSize(600,400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        this.panelSuperior = new PanelSuperior();
        this.panelCentro = new PanelCentral();
        this.panelInferior = new PanelInferior();

        panelSuperior.setBackground(Color.GREEN);
        panelCentro.setBackground(Color.YELLOW);
        panelInferior.setBackground(Color.CYAN);
        //Dimensiones
        panelSuperior.setPreferredSize(new Dimension(600, 80));
        panelInferior.setPreferredSize(new Dimension(600, 60));
        //Añadimos los paneles al frame
        this.add(panelSuperior, BorderLayout.NORTH);
        this.add(panelCentro, BorderLayout.CENTER);
        this.add(panelInferior, BorderLayout.SOUTH);

        setVisible(true);
    }
}

```


---

# 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:

```
GET https://educacion.gitbook.io/programacion/ud5-entrada-e-saida-da-informacion/interfaces-graficas/exemplo-de-interface-grafica-para-xestion-de-persoas/ventanaprincipal.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
