100% encontró este documento útil (1 voto)
1K vistas110 páginas

Tópicos Avanzados de Programación

Libro de tecnologia, realizado por alumnos del instituto tecnologico
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
1K vistas110 páginas

Tópicos Avanzados de Programación

Libro de tecnologia, realizado por alumnos del instituto tecnologico
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 110

TÓPICOS

AVANZADOS DE
PROGRAMACIÓN
ENERO 2020

Ing. César Iván Álvarez Albores


Temario de la materia

UNIDAD 1: Interfaz gráfica de usuario


1.1 Creación de interfaz gráfica para usuarios.

1.2 Tipos de eventos.


1.3 Manejo de eventos.
1.4 Manejo de componentes gráficos de control.
UNIDAD 2: Componentes y librerías
2.1 Definición conceptual de componentes, paquetes / librerías.

2.2 Uso de librerías proporcionadas por el lenguaje.


2.3 Creación de componentes (visuales y no visuales) definidos por el usuario.
2.4 Creación y uso de paquetes/librerías definidas por el usuario.
Temario de la materia

UNIDAD 3: Programación concurrente (MultiHilos)


3.1 Concepto de hilo.

3.2 Comparación de un programa de flujo único contra uno de flujo múltiple.


3.3 Creación y control de hilos.
3.4 Sincronización de hilos computación.
UNIDAD 4: Acceso a datos
4.1 Introducción.

4.2 Conexión a origen de datos.


4.3 Manipulación de datos.
4.4 Visualización de datos.
Temario de la materia

UNIDAD 5: Programación de dispositivos móviles


5.1. Introducción a las tecnologías y herramientas móviles.
5.2 Clasificación y aplicaciones de los dispositivos móviles.
5.3 Entorno operativo de las aplicaciones móviles.
5.4 Desarrollo de aplicaciones móviles.
5.5. Aspectos de seguridad.
Competencias a desarrollar

• Desarrolla soluciones de software para resolver


problemas en diversos contextos utilizando
programación concurrente, acceso a datos, que soporten
interfaz gráfica de usuario y consideren dispositivos
móviles.

Tópicos Avanzados de Programación

SCD-1027
2 3 5
Criterios de evaluación*

EVALUACIÓN ESCRITA Dependiendo la unidad

PRÁCTICAS Dependiendo la unidad

INVESTIGACIONES Dependiendo la unidad

PROGRAMAS Dependiendo la unidad.

PARTICIPACIONES 10%*

• Dependiendo de la unidad, puede requerirse participación activa en la plataforma de Moodle.


• Los exámenes pueden presentarse de manera teórica y práctica.
• Se deberá generar un portafolio de evidencias físico y/o digital para comprobar actividades entregadas.

*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 una API?


API es el acrónimo de Application Programming Interface (Interfaz de
Programación de Aplicaciones), que es un intermediario de software que
permite que dos aplicaciones se comuniquen entre sí. Cada vez que utilizas una
aplicación como Facebook, envías un mensaje instantáneo o compruebas el
tiempo en tu teléfono, estás utilizando una API.
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

¿Cuáles son los elementos que definen a un objeto?


a) Abstracción, herencia y polimorfismo
b) Atributos, asociación e identidad
c) Atributos, comportamiento e identidad.
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.

¿Cuál es el tipo de polimorfismo que tiene la capacidad para definir varios


métodos utilizando el mismo nombre, pero usando diferentes parámetros?
a) Polimorfismo por sobrecarga.
b) Polimorfismo por sobreescritura
Evaluación Diagnóstica

¿Qué significa instanciar una clase?


a) Crear un objeto a partir de la clase.
b) Duplicar una clase
c) Conectar dos clases entre sí
d) Extender su funcionalidad

for, while, do-while y foreach son sentencias de tipo:


a) Iterativas.
b) Selectivas
Evaluación Diagnóstica

¿Concepto que se define como la declaración de un objeto?


a) Interfaz
b) Clase.
c) Polimorfismo

If, If … else y switch son sentencias de tipo:


a) Iterativas
b) Selectivas.
Evaluación Diagnóstica

¿Cuál es el pilar de la POO que consiste en unir en una clase las


características y comportamientos abstraídos de un objeto?
a) Abstracción
b) Herencia
c) Polimorfismo
d) Encapsulamiento.
Evaluación Diagnóstica

¿Qué es una iteración?


En pocas y sencillas palabras, es una repetición de un bloque de código.

¿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

Se considera que el principal lenguaje de Alto nivel fue:


a) ADA
b) C
c) Fortran.
d) Java

¿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

• La interfaz gráfica de usuario (conocido por lo regular por su


acrónimo GUI de Graphic User Interface) es una parte muy
importante dentro del desarrollo de aplicaciones, ya que es lo
primero en que se fija el usuario al momento de ingresar a la
misma. Una mala implementación de la interfaz puede provocar
que el usuario no se interese en nuestra aplicación.
• La interfaz gráfica y el entorno de trabajo deben estar a disposición
del usuario.
• Al usuario se le debe proporcionar un ambiente flexible para que se
le sea fácil el uso de nuestra aplicación.
1.1 Creación de interfaz gráfica para usuarios

• Se llama Interfaz Gráfica de Usuario al conjunto de componentes


gráficos que posibilitan la interacción entre el usuario y la
aplicación.
• Ventanas
• Botones
• Combos
• Listas
• Cajas de diálogo, campos de texto, etc.
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 (Abstract Window Toolkit)


• Swing

La API de AWT es muy limitada y no provee componentes como árboles, matrices,


solapas etc.
Todas las clases de Swing heredan de AWT.

En AWT tanto la creación, como la visualización y gestión de los elementos gráficos


son dependientes del sistema operativo.
En tanto SWING, Java es quien visualiza y gestiona la interacción del usuario sobre los
elementos de la interface gráfica.
1.1 Creación de interfaz gráfica para usuarios

AWT SWING

AWT

SWING
1.1 Creación de interfaz gráfica para usuarios

• El número de clases dentro de Swing es amplia.

• 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.

• Swing está orientado a objetos, se basa en el patrón de diseño observador-observable


para informar de las interacciones del usuario sobre la interface gráfica de usuario.
1.1 Creación de interfaz gráfica para usuarios
Todos los programas o aplicaciones móviles cuentan con un punto de inicio, pues al
ejecutar dicho programa o aplicación, habrá un método que se efectuará primero y
hará que se proceda a realizar alguna acción que el desarrollador haya determinado.

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;

public static void main(String[] args) { Un JFrame es una ventana


uiTest mytestprogram = new uiTest(); simple acompañada de un
mytestprogram.initialise();
} título.

public void initialise() {


JFrame frame = new JFrame("Ejemplo básico!");
Un JLabel es un elemento de
label = new JLabel("¡HOLA MUNDO!"); texto básico.
label.setHorizontalAlignment(SwingConstants.CENTER);
frame.add(label);
frame.setSize(300,200);
frame.setVisible(true);
}
}
Distribución de componentes: Layout
Los componentes se agregan al contenedor con el método add().

JButton unBoton = new JButton("Texto del botón");


panel.add(unBoton);

El efecto de add() depende del esquema de colocación o disposición (layout) del contenedor que se use.

Existen diversos esquemas de disposición: FlowLayout , BorderLayout , GridLayout , ...

Los objetos contenedores se apoyan en objetos LayoutManager (administradores de disposición).

Clases más usadas que implementa la interfaz LayoutManager:


FlowLayout: un componente tras otro de izquierda a derecha.
BorderLayout: 5 regiones en el contenedor (North , South , ...).
GridLayout: contenedor en filas y columnas.

Existen otras tales como BoxLayout, CardLayout, GridBagLayout, GroupLayout, SpringLayout…


Distribución de componentes: Layout
Para organizar el contenedor se utiliza el método setLayout();

Tipo de disposición
Crea una disposición para (BorderLayout, …).
el contenedor actual.

public void setLayout(LayoutManager mgr)

setLayout (new BorderLayout());

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

WEST CENTER EAST

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 se recomienda para ventanas en las que hay un componente central


importante (tales como una tabla, una lista, etc) y tiene menús o barras de herramientas
situados arriba, abajo, a la derecha o a la izquierda.
Distribución de componentes: Layout

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.

setVgap(int) Establece el espacio vertical entre componentes.


Distribución de componentes: Layout

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 1 Widget 2 Widget 3

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.

Por lo general FlowLayout se utiliza para organizar botones en un panel.


Distribución de componentes: Layout

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.

En otras palabras… BoxLayout coloca los componentes verticalmente u


horizontalmente. Los componentes no se ajustarán como en FlowLayout.

Aunque raramente se suele utilizar este tipo de layout.


Distribución de componentes: Layout

BoxLayout
La siguiente tabla enumera los métodos y constructores de BoxLayout más usados:

Constructor / Método Propósito


BoxLayout(Container, int) Crea una instancia de BoxLayout que controla el contenedor especificado. El argumento int especifica el
eje a lo largo del cual se deben diseñar los componentes del contenedor. Cuando el contenedor tiene la
orientación de componente predeterminada, BoxLayout.LINE_AXIS especifica que los componentes se
distribuyan de izquierda a derecha, y BoxLayout.PAGE_AXIS especifica que los componentes se
distribuyan de arriba abajo.
Box (int) Crea un “cuadro” – un contenedor que utiliza un BoxLayout con el eje especificado.

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.

En otras palabras, un objeto GridLayout coloca componentes en una cuadrícula de


celdas. Cada componente ocupa todo el espacio disponible dentro de su celda, y cada
celda tiene exactamente el mismo tamaño.
Distribución de componentes: Layout

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

MVC (Modelo Vista Controlador)

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.)

2. El controlador trata el evento de entrada.


*Previamente se ha registrado

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

MVC en JAVA (Con Swing)

En el caso de Java con Swing podemos desplegar lo siguiente:

▪ 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.”

Los eventos que se generan en los componentes gráficos se clasifican en:


• Eventos de bajo nivel.
• Eventos de alto nivel (Eventos semánticos)
1.2 Tipos de eventos: Eventos de bajo nivel

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.

KeyEvent Operación con el teclado.

Operación con los botones del


MouseEvent
ratón o movimientos del ratón.
Cambio de estado en una
WindowEvent
ventana.
Cambio en la composición,
visibilidad o posición de un
AncestorEvent
elemento superior (ancestro) de
la jerarquía de composición.
1.2 Tipos de eventos: Eventos de alto nivel

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

• Paradigma de la 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.

Programación secuencial (Estructurada) Programación orientada a eventos


El programador es el que define cuál va a ser el Es el propio usuario el que dirige el flujo del
flujo del programa. programa.
Puede haber intervención de un agente externo al
programa, pero solo ocurrirán cuando el Puede ocurrir en cualquier momento.
programador lo haya determinado.
Programación orientada a eventos

• Un programa de procedimiento típico


comienza al principio y continúa hasta
el final

main

• En programas orientados a objetos,


creamos objetos y estos se comunican a
través de llamadas a métodos.
-Pero esta cadena sigue siendo una secuencia…
...y aún termina cuando todas las tareas son
hechas!
Programación orientada a eventos

Entonces, ¿Qué pasa con un programa que tiene que


responder a las entradas del usuario?
- ¿Cómo podría funcionar?
Programación orientada a eventos

• 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

• Funciona igual que el patrón Observador.

• Una parte de los monitores del programa tiene un ciclo de ejecución


permanente que monitorea lo que está sucediendo.

• Otros objetos pueden registrarse para ser notificados cuando se produce


un evento.
Programación orientada a eventos

• En los programas de GUI de Java (interfaz gráfica de usuario), el bucle


queda a nuestro cargo.

• Y depende de nosotros crear clases para


- registrarse para escuchar eventos
- manejar los eventos cuando sucedan.
Programación orientada a eventos

• Al comenzar la ejecución del programa se llevarán a cabo las inicializaciones y demás


código inicial y a continuación el programa quedará “bloqueado” hasta que se
produzca algún evento.

• 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

• Por ejemplo, si el evento consiste en


que el usuario haga clic en el botón de
play de un reproductor multimedia,
se ejecutará el código del
administrador de evento, que será el
que haga que la película se muestre
por pantalla.
Programación orientada a eventos
• Otro ejemplo, tenemos un panel con 3 botones sencillos, que al hacer clic en cada uno de ellos, el color del fondo
cambiará al color apropiado. El ActionListener asociado a cada botón debe ser capaz de “informar” a ButtonPanel
para cambiar su color de fondo. En el método ActionPerformed podemos usar la función miembro getSource() si el
suceso procede de la acción sobre un botón (en este caso) y luego tomar las medidas apropiadas.
1.3 Manejo de eventos

Java.awt.event es el paquete que contiene muchas clases e interfaces de eventos.

Para procesar un evento de interface gráfica de usuario en un programa, se debe


realizar dos tareas clave, primero se debe registrar un componente de escucha del evento
para el componente de la GUI que se espera genere ese evento, y la segunda tarea la de
implementar un método manejador del evento (o un conjunto de métodos manejadores
del evento).
1.3 Manejo de 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.

Un evento ActionEvent se produce:

• Cuando el usuario pulsa un botón.


• Cuando el usuario hace doble clic en un elemento de lista.
• Cuando el usuario pulsa INTRO/ENTER en una caja de texto.
• Cuando el usuario elige un menú.
1.3 Manejo de eventos
1.3 Manejo de eventos
import java.awt.*;
import java.awt.event.*; Importamos la clase event
(1)
import javax.swing.*;
del paquete awt
public class ButtonPanel extends JPanel implements ActionListener{
private final JButton colorButton, color2Button, color3Button ;

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)

setBackground(color); evento viene encapsulada en un


repaint(); objeto genérico derivado de Event.
}
2.1 Definición conceptual de componentes, paquetes / librerías.

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/)

El paquete en Java se declara antes que cualquier otra cosa:

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

Librerías que son mas comunes o usadas por lo regular.


2.3 Creación de componentes (visuales y no visuales)
definidos por el usuario.
En este tema se analizará lo interesante que puede resultar crear componentes propios; es decir, que el
programador no se limite única y exclusivamente a la utilización de los componentes existentes o predefinidos
de la librería Swing.

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 3 Imagen 4: ¿Error?


2.4 Creación y uso de paquetes/librerías
definidas por el usuario.
Si nos percatamos, tenemos una serie de errores en los archivos que acabamos de importar en sus
correspondientes paqueterías. Viendo la imagen1 tenemos 2 tipos de errores, el primero es más que obvio!!!
Nuestro paquete se llama “buttonmaterialdesign” y no “principal” como lo trabajo su desarrollador.

Imagen 2
Imagen 1

El segundo tipo de error (imagen 2) lo solucionamos de la siguiente manera:


Agregamos los archivos .jar de la carpeta llamada librerías.
2.4 Creación y uso de paquetes/librerías
definidas por el usuario.
Empecemos entonces.. Arrastren el archivo Java “MaterialTextField” a su Jframe (“VistaF”)
O rayos… les marca error… ¿cierto?, bueno lo solucionemos entonces… para generar nuestro proyecto
presiona la tecla F11 (Menú ejecutar => Generar Project) e intenta de nuevo… Ya funcionó… ¿Correcto?
2.4 Creación y uso de paquetes/librerías
definidas por el usuario.
Probemos, a modificarlo!
Agrega también los distintos botones que nos proporciona la librería.
2.4 Creación y uso de paquetes/librerías
definidas por el usuario.
2.4 Creación y uso de paquetes/librerías
definidas por el usuario.

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:

• Si un argumento es válido o no,.

• Si una conversión de tipo de datos es incompatible.

• Si existe una falla en la conexión a la base de datos. Etc


Extras: Excepciones en Java

Existen muchas clases de Excepciones ya creadas en el API de Java para resolver


varios de los problemas mencionados, pero, si no existe la clase que se adecue a
nuestras necesidades nosotros podemos crear nuestras propias clases de
excepción.
Extras: Excepciones en Java

Todas las clases en Java descienden de la clase Throwable y posteriormente


existe una jerarquía de clases.

Existen 2 tipos de excepciones particulares, conocidas como checked exceptions y


uncheked exceptions.
Extras: Excepciones en Java
Checked exceptions: Si nuestro programa arroja este tipo de excepción el
compilador solicitará realizar alguna actividad con este tipo de excepción. (Como
procesarlas dentro de un bloque try/catch. Ejemplo de este tipo de excepción de
tipo checked exception es la clase SQLException, la cual es arrojada cuando existe
algún problema con temas relacionados con el uso y manejo de bases de datos.

Unchecked exceptions: Excepciones que heredan de la clase RuntimeException.


Este tipo de excepciones NO estamos obligados a procesarlas, por lo que es
opcional el uso del bloque try/catch. A este tipo de excepciones también se les
conoce como excepciones en tiempo de ejecución. Ejemplos de excepciones
NullPointerException, ArrayOutOfBoundsException, entre otras.
Extras: Excepciones en Java
Extras: Excepciones en Java

De acuerdo a la sintaxis general para el manejo de excepciones, utilizamos el


bloque try/catch.

Como vemos en la imagen anterior, el bloque finally es opcional.

El código que posiblemente arroja la excepción debe estar envuelto por el bloque
try.

Si queremos procesar la excepción lo podremos hacer dentro del bloque catch.


Este bloque es el que recibe el tipo de excepción que queremos procesar.
Extras: Excepciones en Java

Ejemplo de una excepción, es acceder a un elemento de un arreglo fuera de rango,


esto nos arrojaría una excepción de tipo ArrayOutOfBoundException, por lo que
por medio del bloque try/catch es posible procesar este tipo de excepciones.
Programación concurrente (MultiHilos).
UNIDAD 3
3.1 Preguntas al finalizar…
1. ¿Qué es un hilo? 7. ¿Cómo creamos un hilo?
2. ¿Qué diferencias hay entre los programas de flujo
único y los de flujo múltiple?
8. ¿Cómo controlamos un hilo?
3. ¿En qué consiste el ciclo de vida de un hilo?
4. ¿Qué son las prioridades en Hilos y cuáles son?
9. ¿Para qué sirve el
sincronizar los hilos?
5. En Java, se dice que un Thread se encuentra en estado
muerto si:
a) Ha finalizado su método run(). 10. ¿Cómo podemos
b) Si ha ejecutado un sleep(). sincronizar hilos?
c) Si ha recibido el mensaje suspend().
d) Si ha ejecutado un wait().
11. Conclusiones de la unidad
6. ¿Para qué nos sirve Interface Runnable?
3.1 Concepto de hilo

Un hilo es un programa en ejecución que está ejecutando alguna tarea


específica. Un programa Java puede tener múltiples hilos ejecutándose
simultáneamente.

Por ejemplo, cuando utilizamos Word, podemos editar un documento y


también imprimir otro al mismo tiempo. Esto sólo es posible gracias a la
ejecución simultánea de múltiples hilos en el programa Word, donde un hilo se
encarga de editar el documento y otro de imprimir un documento.
3.1 Concepto de hilo

Cuando un programa Java comienza su ejecución, ya hay un hilo


ejecutándose, a este hilo se le denomina normalmente hilo principal
del programa, por que es el único que se ejecuta al comenzar el
programa. El hilo principal es importante por dos razones:

• Es el hilo a partir del cual se crean el resto de los hilos del


programa.

• Normalmente, debe ser el último que finaliza su ejecución, ya que


cuando el hilo principal finaliza, el programa termina.
3.1 Concepto de hilo

Un programa multihilo contiene dos o mas partes que se pueden


ejecutar de manera concurrente o simultanea.

A cada parte del programa se le denomina como hilo (thread).


La programación multihilo es una forma especializada de
multitarea.
3.1 Concepto de hilo

Una gran cantidad de problemas de programación pueden resolverse


utilizando programación secuencial.
Sin embargo, para algunos problemas, resulta conveniente e incluso
esencial ejecutar varias partes del programa en paralelo, de modo que
dichas partes parezcan estarse ejecutando concurrentemente o, si hay
disponibles varios procesadores, se ejecuten realmente de manera
simultánea.
3.1 Concepto de hilo

Un navegador Web es un ejemplo de una aplicación multihilo. En un


navegador típico, puedes desplazarse por una página mientras
descargas una canción o una imagen, reproducir alguna animación y
sonido simultáneamente, imprimir una página en segundo plano
mientras descargas una página nueva o ver cómo tres algoritmos de
clasificación corren hasta el final.
3.1 Concepto de hilo
El sistema run-time de Java depende de hilos para muchas cosas.

Los hilos reducen la ineficiencia al evitar el desperdició de ciclos de CPU.

Los hilos existen en varios estados:

New - Cuando creamos una instancia de la clase Thread, un hilo está en un estado nuevo.

Running – El hilo de Java está en estado de ejecución.

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ó.

Blocked – Un Hilo puede ser bloqueado cuando se espera un recurso.

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

MultiHilos en Java: Clase Thread e Interfaz Runnable

El sistema de multihilos de Java se basa en la clase Thread, sus métodos y su interfaz


complementaria, Runnable.
Para crear un nuevo hilo, el programa extenderá Thread o implementará la interfaz Runnable.

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.

Métodos principales de un hilo (thread)


3.1 Concepto de hilo

¿Cómo crear una Hilo Java?

Java nos permite crear un hilo de dos formas:


• Implementando la interfaz Runnable.
• Extendiendo el Hilo Thread
3.1 Concepto de hilo

Runnable Interface

La forma más fácil de crear un hilo es creando una clase que


implemente la interfaz Runnable.

Para implementar la interfaz Runnable, una clase sólo necesita


implementar un método único llamado run(), que lo podemos declarar
a continuación.
public void run( )
3.1 Concepto de hilo

Runnable Interface

Dentro de run(), definiremos el código que constituye el nuevo Hilo.


Ejemplo:
public class MiClase implements Runnable {
public void run(){
System.out.println("MiClase corriendo");
}
}
3.1 Concepto de hilo
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).

Hilo t1 = new Hilo( new MiClase() );


t1.start();

Cuando se inicia el hilo, se llama al método run() de la instancia MiClase en lugar de


executar su propio método run(). El ejemplo anterior imprimirá el texto “MiClase
corriendo”.
3.1 Concepto de hilo

Extendiendo el hilo Java

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

public class MiClase extends Thread {


public void run(){
System.out.println("MiClase corriendo");
Cuando el método run() se ejecute,
} imprimirá el texto “MiClase
corriendo”
}

Para crear y comenzar el hilo anterior:


MiClase hilo1 = new MiClase ();
hilo1.start();
3.1 Concepto de hilo: Método getName() y setName()
Nombrando a nuestro hilo en Java

La clase Thread proporciona métodos para cambiar y obtener el nombre de un


hilo.
De forma predeterminada, cada hilo tiene un nombre, tal como thread-0, thread-
1 sucesivamente…
Aunque podemos cambiar el nombre de nuestro hilo usando el método
setName().

public String getName(): es usado para devolver el nombre de un hilo.


public void setName (String name): es usado para cambiar el nombre de un hilo.
3.1 Concepto de hilo: Método currentThread()

Hilo Actual

El método currentThread() devuelve una referencia del hilo en ejecución


actualmente.

public static Thread currentThread()

Realicemos un ejemplo…
3.1 Concepto de hilo: Método sleep()

Dormir Hilo

Pone el hilo en pausa el tiempo en milisegundos que le introduzcamos.

La clase Thread proporciona dos métodos para dormir un hilo:

• public static void sleep (long milis) throws InterruptedException

• public static void sleep (long milis, int nanos) throws InterruptedException

Parámetros

milis − Es el tiempo para dormir en milisegundos.

nanos − Se trata de 0-999999 nanosegundos adicionales para dormir.


3.1 Concepto de hilo: Método join()

join

El método java.lang.Thread.join() espera a que dicho hilo muera.

A continuación se muestra la declaración del método join().

public final void join() throws InterruptedException

Parámetros

milis: Tiempo de espera en milisegundos.


3.1 Concepto de hilo: Método isAlive()

¿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.

A continuación se muestra la declaración del método isAlive()

public final boolean isAlive()

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

El método java.lang.Thread.yield() hace que el objeto Thread que se ejecuta actualmente se


detenga temporalmente y permita que se ejecuten otros hilos.

A continuación se muestra la declaración del método yield()


public static void 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().

El término "concurrencia" se refiere a la realización de múltiples tareas al mismo


tiempo.
3.2 Ejemplo sencillo sin HILOS.

Como ejemplo veamos: Hay una clase que produce datos y otra que los visualiza.

La productora de datos se llama "tarea_datos" y la que los muestra se llama "tarea_vista".

"tarea_vista" recibe una referencia a "tarea_datos" para visualizar el resultado.

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().

“tarea_datos” lee un número de un archivo y la “tarea_vista” lo muestra.


3.2 Ejemplo sencillo sin HILOS.
import java.io.*;

public class control01 {

public control01() {
tarea_datos01 t1 = new tarea_datos01();
tarea_vista01 t2 = new tarea_vista01( t1 );
t1.run(); // Lee dato
. t2.run(); // Lo visualiza
}

public static void main(String[] args)


{
control01 control1 = new control01();
}
}
3.2 Ejemplo sencillo sin HILOS.
/******************* Clase que obtiene el dato ******************/
class tarea_datos01 {
private double resultado = -1;

public void run()


{
leer_datos();
}

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

¿Qué es origen de datos?

Está formado por la procedencia de los datos y la información de conexión necesaria para tener acceso a
los mismos.

Ejemplo de orígenes de datos


• Microsoft Access
• Microsoft SQL Server
• Orale RDBMS (Sistema de Gestion de Base de Datos Relacionales)
• Hoja de cálculo de Excel
• Archivo de Texto

También podría gustarte