APO2 - Presentacion nivel 9

Preview:

Citation preview

ALGORÍTMICA Y PROGRAMACIÓN 2 (APO 2)

NIVEL 9

Mario José Villamizar Cano

mj.villamizar24@uniandes.edu.co

Oficina ML-637

http://sistemas.uniandes.edu.co/~mj.villamizar24/dokuwiki/doku.php

Grupo de Tecnologías de Información y Comunicación (COMIT)

Departamento de Ingeniería de Sistemas y Computación

Universidad de los Andes, Bogotá D.C., Colombia

mjvc007@hotmail.com

http://twitter.com/mariocloud

http://linkedin.com/in/mariojosevillamizarcano

REDES SOCIALES

NIVEL 9

Caso de estudio 1 – Una Central de Pacientes

Referencias y ciclos de vida de los objetos

Estructuras lineales enlazadas

Localización de elementos y recorridos

Supresión de elementos

Inserción de elementos

Patrones de algoritmo

Nuevos componentes gráficos (JRadioButton, ButtonGroup, JDialog)

NIVEL 9 – ESTRUCTURAS LINEALES ENLAZADAS

NIVEL 9

CASOS DE ESTUDIO

Caso de estudio 1: Una Central de Pacientes

NIVEL 9

CASOS DE ESTUDIO

Caso de estudio 1: Una Central de Pacientes

NIVEL 9

CASOS DE ESTUDIO

Caso de estudio 2: Aerolínea

NIVEL 9

CASOS DE ESTUDIO

Caso de estudio 2: Aerolínea

NIVEL 9

HOJAS DE TRABAJO

Hoja de trabajo 1: Agenda

NIVEL 9

HOJAS DE TRABAJO

Hoja de trabajo 2: Cadenas de ADN

NIVEL 9

HOJAS DE TRABAJO

Hoja de trabajo 3: Cupi E-Mart

NIVEL 9

HOJAS DE TRABAJO

Hoja de trabajo 3: Cupi E-Mart

NIVEL 9

CASOS DE ESTUDIO

Caso de estudio 1: Una Central de Pacientes

NIVEL 9

CASOS DE ESTUDIO

Caso de estudio 1: Una Central de Pacientes

NIVEL 9

CASO DE ESTUDIO 1 – UNA CENTRAL DE PACIENTES

Requerimientos funcionales.

NIVEL 9

CASO DE ESTUDIO 1 – UNA CENTRAL DE PACIENTES

Requerimientos funcionales.

NIVEL 9

CASO DE ESTUDIO 1 – UNA CENTRAL DE PACIENTES

Requerimientos funcionales.

NIVEL 9

CASO DE ESTUDIO 1 – UNA CENTRAL DE PACIENTES

Modelo del Mundo con un Vector o ArrayList

NIVEL 9

CASO DE ESTUDIO 1 – UNA CENTRAL DE PACIENTES

Representación con un Vector o ArrayList

NIVEL 9

:CentralPacientes

:Paciente

codigo=12

nombre=“Maria”

0

pacientes =

:Paciente

codigo=22

nombre=“Juan”

1

:Paciente

codigo=50

nombre=“Mary”

2

:Paciente

codigo=100

nombre=“Lucas”

n

……

CASO DE ESTUDIO 1 – UNA CENTRAL DE PACIENTES

Modelo del Mundo con un Vector o ArrayList

NIVEL 9

CASO DE ESTUDIO 1 – UNA CENTRAL DE PACIENTES

Representación con una LISTA ENLAZADA SIMPLE

NIVEL 9

Solo se tiene una referencia al primer elemento de la lista.

Cada elemento de la lista tiene una referencia al siguiente-

El último elemento de la lista tiene como referencia null es su atributo siguiente.

El primer elemento de la lista generalmente se le denomina cabeza.

:CentralPacientes

:Paciente

codigo=12

nombre=“Maria”primero

:Paciente

codigo=22

nombre=“Juan”

:Paciente

codigo=50

nombre=“Mary”

:Paciente

codigo=100

nombre=“Lucas” nu

ll

CASO DE ESTUDIO 1 – UNA CENTRAL DE PACIENTES

Modelo del Mundo con una LISTA ENLAZADA SIMPLE

NIVEL 9

CASO DE ESTUDIO 1 – UNA CENTRAL DE PACIENTES

Modelo de la Interfaz

NIVEL 9

CASO DE ESTUDIO 1 – UNA CENTRAL DE PACIENTES

Modelo de las Pruebas

NIVEL 9

LISTAS ENLAZADAS SIMPLES

Es una estructura de datos utilizada en problemas en los cuales es

importante mantener ordenados un conjunto de valores y objetos.

Son muy eficientes para la inserción y eliminación de elementos.

Los desplazamientos en memoria para el caso de los arreglos es

necesario hacerlo a mano.

Los desplazamientos en memoria para el caso de los vectores o

ArrayList los hace automáticamente Java, sin embargo, no lo hace de

manera eficiente.

Utilizadas principalmente en programas en los que hay muchas

inserciones y eliminaciones de elementos, así como en programas en los

cuales dichos elementos deben mantener o cumplir con alguna regla de

ordenamiento.

NIVEL 9

DECLARACIÓN DE UNA LISTA ENLAZADA SIMPLE

NIVEL 9

La definición de una lista enlazada simple

public class CentralPacientes

{

//----------------------------------------------------------------

// Atributos

//----------------------------------------------------------------

/**

* Primer paciente de la lista

*/

private Paciente primero;

}

INICIALIZACIÓN DE UNA LISTA ENLAZADA SIMPLE

NIVEL 9

La inicialización de una lista enlazada simple

public class CentralPacientes

{

public CentralPacientes( )

{

primero = null;

numPacientes = 0;

}

}

Inicialmente la lista no

tiene ningún paciente,

por lo cual primero se

inicializa en null

DECLARACIÓN DE LOS ELEMENTOS DE LISTA ENLAZADA SIMPLE

NIVEL 9

La inicialización de una lista enlazada simple

public class Paciente

{

//---------------------------------------------

// Atributos

//---------------------------------------------

private int codigo;

private String nombre;

private String clinica;

private String informacionMedica;

private int sexo;

/**

* Referencia al siguiente elemento

*/

private Paciente siguiente;

}

Cada elemento de la

lista puede tener una

referencia al siguiente.

CREACIÓN DE UN NUEVO PACIENTE

NIVEL 9

La creación de un objeto de la clase Paciente

public class Paciente

{

//---------------------------------------------

// Métodos

//---------------------------------------------

public Paciente( int cod, String nom, String clin, String infoMed, int sex )

{

codigo = cod;

nombre = nom;

clinica = clin;

informacionMedica = infoMed;

sexo = sex;

siguiente = null;

}

}

Al crear un objeto el

atributo siguiente

referencia a null.

OPERACIONES SOBRE LISTAS ENLAZADAS SIMPLES

NIVEL 9

Búsquedas y recorridos

Calcular el número de pacientes de sexo masculino.

Buscar a un paciente dado su código.

Buscar el número de pacientes asociados con una clínica.

Buscar a un paciente dado su nombre.

Inserción

Insertar un nuevo paciente (al inicio, al final, después de otro paciente, antes de

otro paciente).

Eliminación

Eliminar un paciente dado su código.

BÚSQUEDAS Y RECORRIDOS EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Recorrido total

Definir el método dar número de pacientes en la clase CentralPacientes:

public int darTotalPacientes( )

{

Paciente actual = primero;

int numero = 0;

while( actual != null )

{

numero++;

actual = actual.darSiguiente( );

}

return numero;

}

El recorrido siempre empieza por

la cabeza y se hace utilizando una

variable, regularmente

denominada actual.

El recorrido se hace en un ciclo, el

cual se ejecuta siempre y cuando

no se haya llegado al final de la

lista.

Se efectúan las operaciones

requeridas sobre el elemento

actual.

Se pide que actual ahora

referencia a su elemento

siguiente.

BÚSQUEDAS Y RECORRIDOS EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Recorrido total

Definir el método dar número de mujeres en la clase CentralPacientes:

public int darNumeroMujeres ( )

{

Paciente actual = primero;

int numero = 0;

while( actual != null )

{

if(actual.darSexo( )==Paciente.MUJER)

numero++;

actual = actual.darSiguiente( );

}

return numero;

}

El recorrido siempre empieza por

la cabeza y se hace utilizando una

variable, regularmente

denominada actual.

El recorrido se hace en un ciclo, el

cual se ejecuta siempre y cuando

no se haya llegado al final de la

lista.

Se efectúan las operaciones

requeridas sobre el elemento

actual.

Se pide que actual ahora

referencia a su elemento

siguiente.

BÚSQUEDAS Y RECORRIDOS EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Recorrido parcial

Definir el método hay un hombre en la clase CentralPacientes:

public boolean hayUnHombre ( )

{

Paciente actual = primero;

boolean termino= false;

while( actual != null && !termino)

{

if(actual.darSexo( )==Paciente.HOMBRE)

termino=true;

actual = actual.darSiguiente( );

}

return termino;

}

El recorrido siempre empieza por

la cabeza y se hace utilizando una

variable, regularmente

denominada actual.

El recorrido se hace en un ciclo, el

cual se ejecuta siempre y cuando

no se haya llegado al final de la

lista y no se haya cumplido una

condición.

Se efectúan las operaciones

requeridas sobre el elemento

actual.

Se pide que actual ahora

referencia a su elemento

siguiente.

BÚSQUEDAS Y RECORRIDOS EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Ejercicio de recorrido y búsquedas

Definir el método dar sexo menor número de pacientes en la clase

CentralPacientes. Este método retorna el sexo que tiene el menor número de

pacientes, es decir las constantes HOMBRE o MUJER, en caso de haber

empate el método debe retornar -1.

public int darSexoMenorNumeroPacientes ( )

{

}

BÚSQUEDAS Y RECORRIDOS EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Ejercicio de recorrido y búsquedas

Definir el método dar paciente mayor código en la clase CentralPacientes:

public Paciente darPacienteMayorCodigo ( )

{

}

BÚSQUEDAS Y RECORRIDOS EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Ejercicio de recorrido y búsquedas

Definir el método dar último paciente en la clase CentralPacientes. Este método

retorna null en caso de que no hayan pacientes.

public Paciente darUltimoPaciente( )

{

}

BÚSQUEDAS Y RECORRIDOS EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Ejercicio de recorrido y búsquedas

Definir el método dar última mujer de la lista en la clase CentralPacientes. Este

método retorna null en caso de que no haya una mujer en la lista.

public Paciente darUltimaMujer ( )

{

}

BÚSQUEDAS Y RECORRIDOS EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Ejercicio de recorrido y búsquedas

Definir el método retornar pacientes en ArrayList, en la clase CentralPacientes.

public ArrayList retornarPacientesEnArrayList ( )

{

}

BÚSQUEDAS Y RECORRIDOS EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Ejercicio de recorrido y búsquedas (DOBLE RECORRIDO)

Definir el método hay dos pacientes con el mismo nombre en la clase

CentralPacientes.

public boolean hayDosPacientesConElMismoNombre ( )

{

}

BÚSQUEDAS Y RECORRIDOS EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Ejercicio de recorrido y búsquedas (DOBLE RECORRIDO)

Definir el método hay dos pacientes de la misma clínica en la clase

CentralPacientes.

public boolean hayDosPacientesDeLaMismaClinica ( )

{

}

PATRÓN DE RECORRIDO TOTAL

NIVEL 9

Consiste en pararse una vez en cada uno de los elementos de la lista.

Nodo actual = primero;

while( actual != null )

{

……………

actual = actual.darSiguiente( );

}

PATRÓN DE RECORRIDO PARCIAL PARA LOCALIZAR EL ÚTIMO

ELEMENTO

NIVEL 9

Consiste en localizar el último elemento de la lista.

if ( primero != null )

{

Nodo actual = primero;

while( actual.darSiguiente() != null )

{

……………

actual = actual.darSiguiente( );

}

…………

}

PATRÓN DE RECORRIDO PARCIAL HASTA QUE UN ELEMENTO

CUMPLA UNA CONDICIÓN

NIVEL 9

Consiste en verificar que una condición se cumple sobre por lo menos

un elemento de la lista.

Nodo actual = primero;

boolean termino = false;

while( actual != null && !termino )

{

…………..

actual = actual.darSiguiente( );

}

……………

PATRÓN DE RECORRIDO PARCIAL HASTA QUE UNA CONDICIÓN SE

CUMPLA SOBRE EL SIGUIENTE ELEMENTO

NIVEL 9

Consiste en verificar que una condición se cumple sobre el siguiente

elemento de por lo menos uno de los elementos de la lista.

Nodo actual = primero;

Nodo anterior = null;

boolean termino = false;

while( actual != null && !termino )

{

…………..

anterior = actual;

actual = actual.darSiguiente( );

}

……………

PREGUNTAS

NIVEL 9

HOJA DE TRABAJO

NIVEL 9

INSERCIÓN EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Problemas de inserción típicos

Insertar un elemento al inicio de la lista.

Insertar un elemento al final de la lista.

Insertar un elemento después de otro elemento.

Insertar un elemento antes de otro elemento.

INSERCIÓN EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Problemas de inserción típicos – AL INICIO DE LA LISTA

Definir el método agregar paciente al comienzo, en la clase CentralPacientes:

public void agregarPacienteAlComienzo( Paciente pac )

{

if( primero == null )

{

primero = pac;

}

else

{

pac.cambiarSiguiente( primero );

primero = pac;

}

numPacientes++;

}

Se supone que el paciente

ya se creó normalmente y

que su referencia a siguiente

es null.

Se crea la cabeza si no

existe

Se realiza la adición antes

del paciente que está al

inicio de la lista

INSERCIÓN EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Problemas de inserción típicos – AL FINAL DE LA LISTA

Definir el método agregar paciente al final, en la clase CentralPacientes:

public void agregarPacienteAlFinal( Paciente pac )

{

if( primero == null )

{

primero = pac;

}

else

{ Paciente p = localizarUltimo( );

p.insertarDespues( pac );

}

numPacientes++;

}

Se supone que el paciente

ya se creó normalmente y

que su referencia a siguiente

es null.

Se crea la cabeza si no

existe

Se realiza la adición

después del paciente que

está al final de la lista

INSERCIÓN EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Problemas de inserción típicos – INSERTAR DESPUÉS DE OTRO

ELEMENTO

Definir el método agregar paciente después de otro, en la clase

CentralPacientes:

public void agregarPacienteDespuesDe( int cod, Paciente pac ) throws

NoExisteException

{

Paciente anterior = localizar( cod );

if( anterior == null )

throw new NoExisteException( cod );

else

anterior.insertarDespues( pac );

numPacientes++;

}

Se supone que el paciente

ya se creó normalmente y

que su referencia a siguiente

es null.

Identificador del

elemento anterior

Se localiza el paciente

anterior

Se adiciona el nuevo

paciente después del

anterior

INSERCIÓN EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Problemas de inserción típicos – INSERTAR ANTES DE OTRO

ELEMENTO

Definir el método agregar paciente antes de otro, en la clase CentralPacientes:

public void agregarPacienteAntesDe( int cod, Paciente pac ) throws NoExisteException

{

if( primero == null )

throw new NoExisteException( cod );

else if( cod == primero.darCodigo( ) )

{

pac.cambiarSiguiente( primero );

primero = pac;

}

else

{

Paciente anterior = localizarAnterior( cod );

if( anterior == null )

throw new NoExisteException( cod );

anterior.insertarDespues( pac );

}

numPacientes++;

}

ELIMINACIÓN EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Problemas de inserción típicos – ELIMINAR UN ELEMENTO DE LA

LISTA

Definir el método eliminar paciente, en la clase CentralPacientes:

public void eliminarPaciente( int cod ) throws NoExisteException

{

if( primero == null )

throw new NoExisteException( cod );

else if( cod == primero.darCodigo( ) )

{

primero = primero.darSiguiente( ); // El paciente es el primero de la lista

}

else

{

// El paciente es un elemento intermedio de la lista

Paciente anterior = localizarAnterior( cod );

if( anterior == null )

throw new NoExisteException( cod );

anterior.desconectarSiguiente( );

}

numPacientes--;

}

ELIMINACIÓN EN LISTAS ENLAZADAS SIMPLES

NIVEL 9

Problemas de inserción típicos – ELIMINAR UN ELEMENTO DE LA

LISTA

Definir el método eliminar paciente, en la clase CentralPacientes:

public void eliminarPaciente( int cod ) throws NoExisteException

{

if( primero == null )

throw new NoExisteException( cod );

else if( cod == primero.darCodigo( ) )

{

primero = primero.darSiguiente( ); // El paciente es el primero de la lista

}

else

{

// El paciente es un elemento intermedio de la lista

Paciente anterior = localizarAnterior( cod );

if( anterior == null )

throw new NoExisteException( cod );

anterior.desconectarSiguiente( );

}

numPacientes--;

}

INTERFAZ PRINCIPAL

Caso de estudio 1: Una Central de Pacientes

NIVEL 9

COMPONENTE JDialog

Caso de estudio 1: Una Central de Pacientes

NIVEL 9

Diálogos (JDialog)

Métodos

setSize(ancho, alto)

setResizable(cambiable)

setTitle(titulo)

setDefaultCloseOperation(EXIT_

ON_CLOSE)

setVisible(esVisible)

add(componente)

Puede ser modal o no modal.

Método setLayout( ) del

contenedor gráfico.

Se aplican los tipos de layout

BorderLayout y GridLayout igual

a un JFrame.

NIVEL 9

DIAGRAMA DE CLASES CON JDialog

Modelo de la Interfaz

NIVEL 9

Cada JDialog tiene una referencia

a la interfaz principal.

Las líneas punteadas indican

dependencias (no son atributos).

EJEMPLO DE CREACIÓN DE UN JDialog

NIVEL 9

Cada JDialog tiene una referencia a la interfaz principal.

COMO ABRIR UN JDialog DESDE LA INTERFAZ

NIVEL 9

Las líneas punteadas indican dependencias (no son atributos).

COMPONENTE JRadioButton y ButtonGroup

NIVEL 9

COMPONENTE JRadioButton y ButtonGroup

NIVEL 9

COMPONENTE JRadioButton y ButtonGroup

NIVEL 9

Al panel se adicionan los JRadioButton, NO el ButtonGroup

COMPONENTE JRadioButton y ButtonGroup

NIVEL 9

COMPONENTE JRadioButton y ButtonGroup

NIVEL 9

PREGUNTAS

NIVEL 9

HOJA DE TRABAJO

NIVEL 9

CASOS DE ESTUDIO

Caso de estudio 2: Aerolínea

NIVEL 9

CASOS DE ESTUDIO

Caso de estudio 2: Aerolínea

NIVEL 9

CASO DE ESTUDIO 2 – AEROLÍNEA

Requerimientos funcionales.

NIVEL 9

CASO DE ESTUDIO 2 – AEROLÍNEA

Requerimientos funcionales.

NIVEL 9

CASO DE ESTUDIO 2 – AEROLÍNEA

Requerimientos funcionales.

NIVEL 9

CASO DE ESTUDIO 2 – AEROLÍNEA

Requerimientos funcionales.

NIVEL 9

CASO DE ESTUDIO 2 – AEROLÍNEA

Modelo del Mundo

NIVEL 9

CASO DE ESTUDIO 2 – AEROLÍNEA

Modelo de la Interfaz

NIVEL 9

CASO DE ESTUDIO 2 – AEROLÍNEA

Modelo de las Pruebas

NIVEL 9

CASO DE ESTUDIO 2 – AEROLÍNEA

Representación con una Lista Doblemente Enlazada

NIVEL 9

:Ciudad

:Vuelovuelo1

:Vuelo :Vuelo :Vuelo

nu

ll

codigo=30null codigo=80 codigo=50 codigo=100

OPERACIONES SOBRE LISTAS ENLAZADAS DOBLES

NIVEL 9

Búsquedas y recorridos (Similar a como se hace en la listas simples)

Calcular el número de vuelos que tienen por lo menos una silla disponible.

Buscar a un vuelo dado su código.

Buscar si un usuario tiene una reserva en un vuelo.

Inserción

Insertar un nuevo vuelo (al inicio, al final, después de otro vuelo, antes de otro

vuelo).

Eliminación

Eliminar un vuelo dado su código.

ARREGLOS DE CONSTANTES

NIVEL 9

MANEJO DE FECHAS Y FORMATOS

NIVEL 9

NUEVOS DISTRIBUIDORES GRÁFICOS

NIVEL 9

Distribuidor secuencial - FlowLayout

Distribuidor GridBagLayout

Distribuidor secuencial - FlowLayout

NIVEL 9

Sitúa todos los componentes que se encuentran dentro del contenedor

gráfico, uno después de otro de izquierda a derecha.

Tiene en cuenta el orden de llegada y respeta el tamaño preferido que tienen

establecidos cada uno de los componentes gráficos.

Si se termina el espacio en una fila, el distribuidor comienza a usar la

siguiente.

Distribuidor secuencial - FlowLayout

NIVEL 9

Distribuidor secuencial - FlowLayout

NIVEL 9

Distribuidor GridBagLayout

NIVEL 9

Distribuidor muy flexible que permite crear interfaces gráficas de usuario con

una estructura profesional.

Utiliza una malla dinámica en la que cada componente puede utilizar una o

más celdas.

Implementado por dos clases en Java:

GridBagLayout: El distribuidor

GridBagConstraints: Describe las características (posición, tamaño, forma de

adaptarse a los cambios de tamaño, etc.

En el método add para adicionar un nuevo componente al distribuidor, se

debe pasar como parámetro una instancia de la clase GridBagConstraints.

Se verán las principales características de este distribuidor. Para una

documentación más completa se recomienda consultar la documentación de las

clases GridBagLayout y GridBagConstraints.

Objetos de la Clase GridBagConstraints

NIVEL 9

Un objeto de la clase GridBagConstraints tiene definidos (entre otros) los

siguientes atributos.

gridx: Coordenada X de la celda de la malla del distribuidor donde comienza el

componente.

0 1 2

Coordenada X

0

1

2

Coordenada Y

Objetos de la Clase GridBagConstraints

NIVEL 9

Un objeto de la clase GridBagConstraints tiene definidos (entre otros) los

siguientes atributos.

gridy: Coordenada Y de la celda de la malla del distribuidor donde comienza el

componente.

gridwitdh: Número de casillas que va a ocupar el componente en la dirección X.

gridheigh: Número de casillas que va a ocupar el componente en la dirección Y.

Objetos de la Clase GridBagConstraints

NIVEL 9

Un objeto de la clase GridBagConstraints tiene definidos (entre otros) los

siguientes atributos.

fill: Usado cuando el espacio reservado para el componente es mayor que el

espacio que el componente necesita. Puede tomar los siguientes valores:

GridBagConstraints.NONE (valor por defecto y corresponde a no hacer nada).

GridBagConstraints.HORIZONTAL (cambia el tamaño del componente en la

dirección horizontal).

GridBagConstraints.VERTICAL (cambia el tamaño del componente en la

dirección vertical).

GridBagConstraints.BOTH (hace cambios en la dos dimensiones para ocupar

todo el espacio disponible en el distribuidor).

Objetos de la Clase GridBagConstraints

NIVEL 9

Un objeto de la clase GridBagConstraints tiene definidos (entre otros) los

siguientes atributos.

weightx: Define la manera como se va a distribuir el espacio extra en la

dimensión X. Utilizado principalmente cuando se cambie el tamaño del

contenedor gráfico.

weighty: Define la manera como se va a distribuir el espacio extra en la

dimensión Y. Utilizado principalmente cuando se cambie el tamaño del

contenedor gráfico.

Ejemplo con GridBagLayout

NIVEL 9

Ejemplo con GridBagLayout

NIVEL 9

Ejemplo con GridBagLayout

NIVEL 9

Ejemplo con GridBagLayout

NIVEL 9

Ejemplo con GridBagLayout

NIVEL 9

Ejemplo con GridBagLayout

NIVEL 9

PREGUNTAS

NIVEL 9

HOJA DE TRABAJO

NIVEL 9

Recommended