Tópicos Avanzados de Programación
Tópicos Avanzados de Programación
AVANZADOS DE
PROGRAMACIÓN
ENERO 2020
SCD-1027
2 3 5
Criterios de evaluación*
PARTICIPACIONES 10%*
*Para criterios de evaluación de cada unidad actualizados, favor de revisar la Instrumentación Didáctica en SII.
Conceptos básicos antes de iniciar…
¿Qué es un IDE?
Un entorno de desarrollo integrado (IDE) es una aplicación que facilita el
desarrollo de aplicaciones. En general, un IDE es un banco de trabajo basado en
una interfaz gráfica de usuario (GUI) diseñado para ayudar a un desarrollador
a crear aplicaciones de software con un entorno integrado combinado con
todas las herramientas necesarias.
Evaluación Diagnóstica
Elige aquellas definiciones de código que tienen que ver con herencia:
❑public class Gallina:Ave.
❑public class Gallina inherit Ave
❑public class Gallina implements Ave
❑public class Gallina extends Ave.
Evaluación Diagnóstica
¿Qué es POO?
Dependiendo de la opinion del alumno puede variar, sin embargo podemos decir
que POO es un paradigma de programación en el que tanto la estructura como la
ejecución de los programas van determinados por los sucesos que ocurran en el
sistema, definidos por el usuario o que ellos mismos provoquen.
¿Qué es un Algoritmo?
Un conjunto de instrucciones o reglas bien definidas, ordenadas y finitas que
permiten realizar una actividad mediante pasos sucesivos que no generen
dudas a quien deba realizar dicha actividad.
Evaluación Diagnóstica
¿Qué es un Algoritmo?
Un conjunto de instrucciones o reglas bien definidas, ordenadas y finitas que permiten
realizar una actividad mediante pasos sucesivos que no generen dudas a quien deba
realizar dicha actividad.
1.1 Creación de interfaz gráfica para usuarios
1.1 Creación de interfaz gráfica para usuarios
Java provee dos APIs con las que se puede trabajar para el desarrollo de GUIs.
AWT SWING
AWT
SWING
1.1 Creación de interfaz gráfica para usuarios
• Swing nos permite desarrollar interfaces gráficas de usuario mucho más potentes y
aparentes que AWT, gracias a la gran cantidad y calidad de los controles gráficos
que ofrece.
Por ejemplo: Splashscreen’s, mostrar una pantalla para iniciar sesión, etc. A dicho
método le conocemos como “método main”, que por lógica debe ir dentro de una clase
Java, que será en dicho caso la clase principal del software.
1.1 Creación de interfaz gráfica para usuarios
Cuando estamos creando un nuevo proyecto Java con nuestro IDE NetBeans, se nos
abre una ventana requiriendo el nombre del proyecto así como la posibilidad de crear
la clase principal y darle un nombre, aunque en primer instancia es opcional.
1.1 Creación de interfaz gráfica para usuarios
package guiExample;
En Java el conjunto de clases
import javax.swing.*; para trabajar con GUI es
llamado Swing.
public class uiTest {
private JLabel label;
El efecto de add() depende del esquema de colocación o disposición (layout) del contenedor que se use.
Tipo de disposición
Crea una disposición para (BorderLayout, …).
el contenedor actual.
setLayout(new FlowLayout());
setLayout(new GridLayout(3,4);
El layout manager elige la mejor disposición y tamaño de cada componente de acuerdo al espacio
disponible.
Distribución de componentes: Layout
BorderLayout
Organiza nuestro contenedor en cinco zonas.
NORTH
SOUTH
Distribución de componentes: Layout
BorderLayout
Si se amplía la ventana, el área central obtiene la mayor cantidad de espacio disponible
posible.
Las otras áreas se expanden solo lo necesario para llenar todo el espacio disponible.
Por lo regular, un contenedor utiliza solo una o dos de las áreas del objeto
BorderLayout, “solo el centro, o el centro y la parte inferior”
BorderLayout
La siguiente tabla enumera los constructores y los métodos para especificar espacios
(en píxeles):
Constructor Propósito
BorderLayout(int horizontalGap, Define un diseño de borde (Border Layout) con espacios especificados entre componentes.
int verticalGap)
setHgap (int) Establece el espacio horizontal entre componentes.
BorderLayout
La siguiente tabla enumera los constructores y los métodos para especificar espacios (en píxeles):
Distribución de componentes: Layout
FlowLayout
En este caso los componentes son colocados de izquierda a derecha y de arriba hacia
abajo.
Widget 4 Widget 5 …
Distribución de componentes: Layout
FlowLayout
Entonces como vimos en la diapositiva anterior este tipo de Layout, coloca todos los
componentes que le añadamos alineados de izquierda a derecha, haciendo que cada
uno ocupe lo que necesita, inicia una nueva fila si no hay más componentes que
encajen en una fila.
FlowLayout
La siguiente tabla enumera los constructores de la clase FlowLayout:
Constructor Propósito
FlowLayout() Construye un nuevo objeto FlowLayout con una alineación centrada y espacios horizontales y verticales
con el tamaño predeterminado de 5 px.
FlowLayout (int align) Crea un nuevo gestor flow layout con la alineación indicada. Los argumentos de la alineación pueden ser:
FlowLayout.LEADING, FlowLayout.CENTER ó FlowLayout.TRAILING.
“Cuando el objeto FlowLayout controla un contenedor con una orientación de componente de izquierda a
derecha (valor predeterminado), el valor LEADING especifica los componentes que deben alinearse a la
izquierda, y TRAILING los que deben alinearse a la derecha.
FlowLayout(int align, int hgap, Crea un nuevo gestor Flow layout con la alineación indicada, y espacios horizontales y
int vgap) verticales indicados. Los argumentos hgap y vgap especifican el número de píxeles para
colocar entre los componentes.
Distribución de componentes: Layout
BoxLayout
Organiza los componentes uno encima del otro o en una fila. Como el diseño de la caja
organiza los componentes, toma en cuenta las alineaciones de los componentes y los
tamaños mínimo, preferido y máximo.
Es como un FlowLayout, pero mucho más completo. Permite colocar los elementos en
horizontal o vertical.
BoxLayout
La siguiente tabla enumera los métodos y constructores de BoxLayout más usados:
static Box createHorizontalBox() Crea un cuadro que presenta sus componentes de izquierda a derecha.
(in box)
static Box createVerticalBox() (in Crea un cuadro que presenta sus componentes de arriba abajo.
box)
Distribución de componentes: Layout
GridLayout
Este tipo de Layout dsitribuye los componentes en forma de matriz (cuadrícula),
estirándolos para que tengan todos el mismo tamaño. GridLayout es adecuado para
hacer tableros, calculadoras en que todos los botones son iguales, etc.
GridLayout
La siguiente tabla enumera los constructores de la clase GridLayout que especifican el
número de filas y columnas:
Constructor Propósito
GridLayout(int rows, int cols) Crea un diseño de cuadrícula con el número especificado de filas y columnas. Todos los componentes en
el diseño tienen el mismo tamaño. Una, pero no ambas, de filas y columnas puede ser cero, lo que significa
que cualquier número de objetos se puede colocar en una fila o en una columna.
GridLayout(int rows, int cols, int Crea un gridLayout con el número especificado de filas y columnas. Además, los espacios horizontales y
verticales se ajustan a los valores especificados. Los espacios horizontales se ubican entre cada una de las
hgap, int vgap) columnas. Los espacios verticales se colocan entre cada una de las filas.
1.1 Creación de interfaz gráfica para usuarios
1.1 Creación de interfaz gráfica para usuarios
1.1 Creación de interfaz gráfica para usuarios
Flujo de control
1. El usuario realiza una acción en la interfaz (por ejemplo presionando botones, introduciendo texto, moviendo el
mouse por la pantalla, etc.)
3. El controlador notifica al modelo la acción del usuario, lo que puede implicar un cambio del estado del modelo
(si no es una mera consulta).
4. Se genera una nueva vista. La vista toma los datos del modelo
*El modelo no tiene conocimiento directo de la vista.
5. La interfaz de usuario espera otra interacción del usuario, que comenzará otro nuevo ciclo.
1.1 Creación de interfaz gráfica para usuarios
▪ Modelo:
▪ Lo realiza el desarrollador.
▪ Vista:
• Conjunto de objetos de clases que heredan de java.awt.Component
▪ Controlador:
• El controlador es el thread de tratamiento de eventos, que captura y propaga los eventos a la vista y al
modelo.
• Clases de tratamiento de los eventos que implementan interfaces de tipo EventListener (ActionListener,
MouseListener, WindowsListener, etc)
1.2 Tipos de eventos
“Un evento es un suceso que ocurre como consecuencia de la interacción del usuario (o
bien por el sistema, etc.) con la interfaz gráfica.”
EVENTO SIGNIFICADO
• Representan entradas o
interacciones de bajo nivel con Cambio de foco (capacidad de
elementos del interfaz gráfico. FocusEvent un componente para recibir
entradas desde el teclado)
Cambios en el tamaño, posición
ComponentEvent
o visibilidad de un componente.
EVENTO SIGNIFICADO
• Encapsula la semántica de
componentes del interfaz de Realización de la acción
usuario. ActionEvent específica asociada al
componente.
Cambio en el estado del
ChangeEvent
componente.
Elemento seleccionado o
ItemEvent
deseleccionado.
Clase que representa cuando un
CaretEvent evento ha cambiado dentro de
un componente de texto.
Cambio en la selección actual en
ListSelectionEvent
una lista.
El contenido de texto de algún
TextEvent
componente ha cambiado.
Programación orientada a eventos
main
• Patrón Observador
El patrón observador es cuando un manejador de clase se ocupa de algunos
datos.
-Entonces, otras clases se registran en él.
- Cuando los datos cambian, el manejador de datos notifica a todas las
clases registradas que puedan tomar alguna acción.
Como en Hollywood...
No nos llames, nosotros te llamamos.
Programación orientada a eventos
• Cuando alguno de los eventos esperados por el programa tenga lugar, el programa
pasará a ejecutar el código del correspondiente administrador de evento.
Programación orientada a eventos
Cuando ocurre un evento, el componente de la GUI con el que el usuario interactuó notifica a sus
componentes de escucha registrados, llamando al método manejador de eventos apropiado de cada
componente de escucha.
Por ejemplo, cuando el usuario oprime la tecla Enter (evento ocurrido) en un objeto JTextField
(Componente), se hace una llamada al manejador de eventos actionPerformed (método) del componente
ActionListener (componente de escucha registrado).
1.3 Manejo de eventos
ActionListener
Es una interfaz y por tal se debe de implementar todos los métodos que ella posee, en este caso solo uno
que es actionPerformed(ActionEvent e). Ahora vamos a ver como usar esta interfaz y en que nos puede
ayudar.
Su propósito es para detectar y manejar eventos de acción, ósea, los que tienen lugar cuando se produce
una acción sobre un elemento del programa.
public ButtonPanel(){
colorButton = new JButton("Cambiar color Background"); (2) Implementamos la interfaz
color2Button = new JButton("Yo también cambio el color");
color3Button = new JButton("Elígeme a mí :D");
colorButton.addActionListener(this);
color2Button.addActionListener(this);
color3Button.addActionListener(this); Establecemos la relación
(4)
add(colorButton); entre el origen del evento y el
add(color2Button);
add(color3Button);
escuchador.
}
@Override
public void actionPerformed(ActionEvent evt){ (3) Se debe implementar el
Object source = evt.getSource(); método abstracto de la
Color color = getBackground();
interface.
if (source == colorButton) color = Color.decode("#00897B");
else if (source == color2Button) color = Color.decode("#FF5722");
else if (source == color3Button) color = Color.decode("#FF4081"); La información acerca del
(5)
Componentes
Una GUI se compone de bloques individuales de construcción como botones, barras de desplazamiento, menús
desplegables, etiquetas, listas, etc. Algunos programadores conocen estos bloques individuales de construcción
como controles, mientras otros les suelen llamar widgets. En Java, son llamados componentes porque todos ellos
heredan de la clase base java.awt.Component
(https://docs.oracle.com/javase/7/docs/api/java/awt/Component.html)
Los componentes permiten al usuario interactuar con la aplicación y proporcionar información desde el programa al
usuario sobre el estado de la aplicación.
2.1 Definición conceptual de componentes, paquetes / librerías.
PAQUETES
Un paquete permite a un desarrollador agrupar clases (e interfaces) juntas. Todas estas clases estarán relacionadas
de alguna manera - todas podrían tener que ver con una aplicación específica o realizar un conjunto específico de
tareas.
Por ejemplo, la API Java está llena de paquetes. Uno de ellos es el paquete javax.xml. Éste y sus subpaquetes
contienen todas las clases de la API Java relacionadas con el manejo de XML.
(Especificación de la API para la plataforma Java ™, edición estándar. - https://docs.oracle.com/javase/7/docs/api/)
La declaración del paquete debe estar al principio del archivo Java, es decir, es la primera línea que
se debe ver en nuestro código o archivo .java. Primero se declara el paquete, y luego podremos
poner los imports y luego las clases, interfaces, métodos, etc.
2.1 Definición conceptual de componentes, paquetes / librerías.
LIBRERÍAS
Las librerías en programación son aquellos paquetes creados por terceros que podemos agregar a nuestros
proyectos para enriquecer el sistema o aprovechar ciertas funcionalidades.
De una forma más completa, las librerías en Java nos permiten reutilizar código, es decir que podemos hacer uso de
los métodos, clases y atributos que componen la librería evitando así tener que implementar nosotros mismos esas
funcionalidades.
2.2 Uso de librerías proporcionadas por el lenguaje.
Java nos proporciona librerías ya definidas para su uso, dependiendo de las necesidades será la librería a usar.
java.awt javax.swing
java.security java.io
java.math java.sound.midi
java.lang java.applet
java.net java.util
javax.xml java.sql
Por ejemplo, se podría necesitar una calculadora o un calendario a través de una interfaz gráfica y, para
obtener esa funcionalidad conjunta lo lógico sería crear un componente propio que representará dicha
calculadora o calendario.
Para crear un componente propio, lo que se suele hacer es utilizar un contenedor Jpanel, configurarlo y añadir
los componentes que se requieran para lograr esa funcionalidad conjunta que se persigue. Se puede en este
ejemplo añadir los típicos botones, un campo de texto, etc. Pero, para que un componente propio sea igual que
cualquier componente predefinido de Swing, es necesario que sea capaz de generar eventos.
2.4 Creación y uso de paquetes/librerías
definidas por el usuario.
Realicemos un ejemplo, descargando e incorporando una librería realizada por un tercero… con el fin de dotar
nuestra interfaz gráfica como si de MATERIAL DESIGN (de Google) se tratara.
https://res.cloudinary.com/pillo3/raw/upload/v1551714492/MaterialDesign_LibreriaTerceros_fx7ebk.rar
https://bit.ly/2Ui9bN7
2.4 Creación y uso de paquetes/librerías
definidas por el usuario.
Ahora extraemos en una carpeta de tu preferencia el archivo rar que acabamos de descargar.
• Ubícate en la ruta …\MaterialDesign_LibreriaTerceros\MaterialButtons\src\principal
• Verás esta lista de archivos (Imagen 1)
• Arrastra los 4 elementos hacia el paquete que creamos anteriormente “buttonmaterialdesign”
• Creamos otros 2 paquetes llamados “fonts” y “efectos” (como se observa en la Imagen 3)
• Repetimos el paso 3 pero para el paquete “fonts” de la carpeta …\MaterialButtons\src\fonts y para el
paquete “efectos” de la carpeta …\MaterialButtons\src\efectos
Imagen 1 Imagen 2
Imagen 2
Imagen 1
4
2.4 Creación y uso de paquetes/librerías
definidas por el usuario.
4
Extras: Excepciones en Java
Una excepción es una situación NO esperada en la ejecución de un programa.
Por ejemplo:
El código que posiblemente arroja la excepción debe estar envuelto por el bloque
try.
New - Cuando creamos una instancia de la clase Thread, un hilo está en un estado nuevo.
Suspended – Un hilo en ejecución puede ser suspendido, lo que suspende temporalmente su actividad. Un
hilo suspendido puede entonces reanudarse, lo que le permite continuar donde se quedó.
Terminated – Un Hilo puede terminarse, lo que detiene su ejecución inmediatamente en cualquier momento.
Eso sí… una vez terminado el hilo, no se puede reanudar.
3.1 Concepto de hilo
La clase Thread define varios métodos que ayudan a administrar hilos. Esto lo podemos ver en la
siguiente diapositiva mediante una tabla,
3.1 Concepto de hilo
MÉTODO DESCRIPCIÓN
final void setName(String) Pone el nombre al hilo actual
final String getName( ) Obtiene el nombre del hilo actual
Static sleep(long milisegundos) throws Suspende un tiempo para que se ejecute otro
InterruptedException hilo.
final void join( ) Espera a que los hilos terminen
final boolean isAlive( ) Es para ver si esta en ejecución un hilo o si esta
activo.
void start( ) Comienza un hilo llamando a su método run
void run( ) Punto de entrada de un Hilo
final int getPriority( ) Obtiene la prioridad de un hilo
final void setPriority(int nivel) Establece la prioridad de un hilo.
Runnable Interface
Runnable Interface
Para ejecutar el método run() por un hilo, pasa una instancia de MiClase a un Thread en
su constructor (Recuerda: un constructor en Java es un bloque de código similar a un
método que se llama cuando se crea una instancia de un objeto).
La segunda forma de crear un hilo es crear una nueva clase que extienda Thread,
luego sobreescribir el método run() y luego crear una instancia de esa clase.
El método run() es el que ejecuta el hilo después de llamar a start(). A
continuación se muestra un ejemplo de creación de una subclase de hilos Java:
3.1 Concepto de hilo
Hilo Actual
Realicemos un ejemplo…
3.1 Concepto de hilo: Método sleep()
Dormir Hilo
• public static void sleep (long milis, int nanos) throws InterruptedException
Parámetros
join
Parámetros
¿Está vivo?
El método java.lang.Thread.isAlive() comprueba si dicho hilo está vivo. Un hilo está vivo si se ha
iniciado y aún no ha muerto.
Parámetros
Ninguno
Este método devuelve verdadero si dicho hilo está vivo, falso de lo contrario.
3.1 Concepto de hilo: Método yield()
Yield
Parámetros
Ninguno
3.2 Comparación de un programa de flujo
único contra uno de flujo múltiple.
Un programa de flujo único o single-thread utiliza un único flujo de control (thread) para controlar su
ejecución. Muchos programas no necesitan la potencia o utilidad de múltiples flujos de control. Sin necesidad
de especificar explícitamente que se quiere un único flujo de control, muchos de los applets y aplicaciones
son de flujo único.
Hola Mundo… el ejemplo más esencial en el inicio de cualquier lenguaje de programación… ¿No?
.
public class HolaMundo {
static public void main( String args[] ) {
System.out.println( "Hola Mundo!" );
}
}
Como vemos, al llamar a main(), el programa imprime el mensaje y termina. Esto ocurre dentro de un único
hilo de ejecución (thread).
3.2 Comparación de un programa de flujo
único contra uno de flujo múltiple.
Java soporta tanto operaciones con un solo hilo (flujo único) como con varios
hilos (flujo múltiple).
Un programa de un solo hilo tiene un solo punto de entrada (el método main() )
y un solo punto de salida.
.
Un programa multihilo tiene un punto de entrada inicial (el método main() ),
seguido de muchos puntos de entrada y salida, que se ejecutan
simultáneamente con el método main().
Como ejemplo veamos: Hay una clase que produce datos y otra que los visualiza.
Como se indica en el título de esta diapositiva, este ejemplo no contendrá aún hilos.
.
Para acercarnos a lo que será la explicación sobre hilos, cada clase realiza su labor en la función run().
public control01() {
tarea_datos01 t1 = new tarea_datos01();
tarea_vista01 t2 = new tarea_vista01( t1 );
t1.run(); // Lee dato
. t2.run(); // Lo visualiza
}
void leer_datos() {
String miArchivo = "src/extras/holapapu.txt";
. try {
BufferedReader in = new BufferedReader( new FileReader(miArchivo) );
resultado = Double.parseDouble( in.readLine() );
in.close();
}
catch (Exception e)
{
System.out.println( e.getMessage() );
}
}
double obt_resultado()
{
return resultado;
}
}
Acceso a datos.
UNIDAD 4
4.1 Introducción
Está formado por la procedencia de los datos y la información de conexión necesaria para tener acceso a
los mismos.