Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
FACULTAD DE INGENIERIA
PARTE - 3
Primera Edición
Universidad Nacional del Santa
Facultad de Ingeniería Programación Visual con Java
E.A.P. Sistemas e Informática
Uso de paquetes
En Java, es posible agrupar varias clases en una estructura llamada paquete. Un
paquete no es más que un conjunto de clases, generalmente relacionadas entre sí de
alguna manera. Es habitual diseñar una aplicación distribuyendo su funcionalidad
entre varios paquetes, cuyas clases se comunican entre sí a través de interfaces bien
definidas.
El uso de paquetes aporta varias ventajas frente a la programación sin paquetes. En
primer lugar, permite encapsular funcionalidad en unidades con un cierto grado de
independencia, ocultando los detalles de implementación. De esta forma se pueden
conseguir diseños (e implementaciones) más limpios y elegantes.
Por otra parte, se potencia la reutilización de las clases desarrolladas. Es posible
definir interfaces de uso de cada paquete, para que otros paquetes o aplicaciones
puedan utilizar la funcionalidad implementada. Además, el uso de paquetes permite la
reutilización de los nombres de las clases, ya que el espacio de nombres de un
paquete es independiente del de otros paquetes. El lenguage Java impone la
restricción de que una clase debe tener un nombre único, dentro del paquete al cual
pertenece. Sin embargo, es posible que dos clases tengan el mismo nombre, siempre
y cuando pertenezcan a paquetes distintos.
Para incluir una clase dentro de un paquete, únicamente hay que utilizar una
sentencia package al principio del fichero fuente.
Por ejemplo:
package prueba;
public class Prueba
{
...
}
o con subpaquetes:
package prueba.prueba2;
public class Prueba
{
...
}
El nombre completo de la clase (fully qualified name) está compuesto por el nombre
del paquete al cual pertenece la clase además del nombre de la propia clase.
Los nombres completos de las clases del ejemplo anterior son prueba.Prueba y
prueba.prueba2.Prueba.
Dado que prueba y prueba.prueba2 son paquetes distintos (aunque prueba.prueba2
sea un subpaquete de prueba), no hay colisión de nombres entre prueba.Prueba y
prueba.prueba2.Prueba. Sin embargo, aunque el compilador permita usar el mismo
nombre de esta forma, no es una práctica aconsejable porque el código tiende a ser
confuso y propenso a errores.
En cuanto al nombre de los paquetes, Sun propuso en su momento un convenio para
facilitar el uso de paquetes de terceros. Este convenio no es en absoluto obligatorio,
aunque sí es aconsejable seguir alguno, o bien éste o bien otro, para mantener
mínimamente organizadas nuestras clases.
Para usar clases de otros paquetes, no hay más que utilizar sentencias import, antes
de la declaración de la clase.
Por ejemplo:
import java.lang.*;
import java.util.Vector;
import java.rmi.server.*;
Con el primer import le estamos indicando al compilador que vamos a importar todas
las clases del subpaquete java.lang. (Este paquete contiene clases esenciales en la
mayoría de aplicaciones Java, por lo que el compilador lo importa automáticamente,
aunque no incluyamos una línea como la de arriba). Con el segundo import, indicamos
que sólo queremos importar la clase Vector del subpaquete java.util. Con el tercer
import, importamos todas las clases del paquete java.rmi.server.
Es posible utilizar una clase sin que esté incluída en un import, siempre y cuando
utilicemos su nombre completo.
Por ejemplo:
java.util.Vector vector = new java.util.Vector(100, 10);
La ventaja de utilizar una sentencia import es que la anterior línea se puede reducir a
Vector vector = new Vector(100, 10);
Etapas
Durante la etapa de entrada, se lee los datos de una fuente y se aprueban en buffers
a la etapa de procesamiento. La etapa de entrada puede consistir en la lectura de
datos desde un dispositivo de captura (como una cámara web o tarjeta de captura de
TV), un archivo en el disco o arroyo De la red.
La etapa de procesamiento consiste en una serie de codecs y efectos diseñados para
modificar el flujo de datos a uno adecuado para la producción. Estos codecs podrán
ejercer funciones como comprimir o descomprimir el audio a un formato diferente, la
adición de una marca de agua de algún tipo, la limpieza de ruido o aplicar un efecto
de la corriente (como eco a los de audio).
Una vez que la etapa de procesamiento se ha aplicado sus transformaciones a la
corriente, pasa la información a la etapa de salida. La fase de salida puede tomar la
corriente y pasarlo a un archivo en el disco, la producción local a la pantalla de vídeo
o transmitirlo a través de la red .
Por ejemplo, un sistema de JMF puede leer el aporte de una tarjeta de captura de TV
local el sistema de captación de los aportes de una grabadora en la etapa de entrada.
Puede entonces pasar a la fase de transformación, para añadir una marca de agua en
la esquina de cada cuadro y, por último, emisión A través de la Intranet local en la
etapa final.
Componente de Arquitectura
JMF es construido alrededor de una arquitectura de componentes. El compenents se
organizan en una serie de categorías principales:
• Medios manipuladores
• Fuente de los datos
• Codecs / Efectos
• Extracción de grasas
• Mux / Demuxes
Medios Manipuladores
MediaHandlers están registradas para cada tipo de archivo que JMF debe ser capaz de
manejar. Para apoyar nuevos formatos de archivo, un nuevo MediaHandler se pueden
crear.
RenderersExtracción de grasas
Un procesador es similar a un Codec, pero la final está en un lugar diferente al otro
arroyo. VideoRenderer Un salidas los datos finales a la pantalla, sino otro tipo de
procesador podría salida a los diferentes equipos, como por ejemplo una tarjeta de
salida de TV.
Mux/DemuxesMux / Demuxes
Multiplexores y Demultiplexers se utilizan para combinar múltiples arroyos en una sola
corriente o viceversa, respectivamente. Son útiles para crear y leer un paquete de
audio y video para guardarse en el disco como un solo archivo, o se transmite a través
de una red.
Aplicación multimedia
Presenting Data
Una aplicación multimedia es aquella que produce, reproduce, procesa o maneja uno
o varios contenidos multimedia. A su vez un contenido multimedia es aquel que está
compuesto de diversos “medios”, como pueden ser audio, video, texto, etc. Decimos
que un contenido multimedia está basado en el tiempo en tanto que cada uno de sus
medios cambia significativamente con él. Esta característica hace que un contenido
multimedia requiera ser proporcionado y procesado en unas condiciones temporales
estrictas. Por ejemplo cuando se reproduce un video, si los datos multimedia no
pueden ser proporcionados lo suficientemente rápido pueden producirse pausas y
retardos en la reproducción; por otro lado si los datos no pueden ser recibidos y
procesados lo suficientemente rápido el video se reproduce a saltos en tanto que se
desechan cuadros como medio para mantener la tasa de reproducción.
Cada uno de los medios de los que se compone un contenido multimedia se denomina
pista . Por ejemplo un contenido multimedia correspondiente a una videoconferencia
puede contener una pista de audio y otra de video. Se dice que las pistas que
componen un contenido multimedia están multiplexadas, al proceso de extracción de
las distintas pistas que componen un contenido multimedia se le denomina
demultiplexación. Existen distintos tipos de pistas en función del tipo de datos que
contienen, como audio y/o video; a su vez cada pista posee un formato que define
como están estructurados los datos que forman parte de ella. Los distintos formatos
se distinguen en función de:
• La calidad que proporcionan
• Su exigencia de recursos de CPU para ser procesados.
• La cantidad de ancho de banda requerida para su transmisión.
En Java Media Framework los datos multimedia pueden proceder de diversas
fuentes, como archivos locales o remotos y video y audio en tiempo real o bajo
demanda.
Una fuente de datos multimedia se modela mediante un objeto DataSource. Podemos
crear una DataSource directamente a través de una URL (Universal Resource Locator)
o bien mediante un objeto de tipo MediaLocator.
Vamos a proceder a ejecutar un audio, para ello necesitamos un arhivo de formato
mp3, como por ejemplo mana.mp3. Para lograr esto sigamos los siguientes pasos:
Luego dar click en el botón de comando Finish (en caso de que la versión de
NetBeans es en castellano entonces dar click en el botón de comando
Terminar)
5. Estando en el entorno de NetBeans borramos lo que observamos seleccionado:
}
else if (event instanceof ControllerErrorEvent){
player = null;
System.err.println(((ControllerErrorEvent)event).getMessage());
}
}
public void paint(Graphics g) {
}
}
7. Compilamos el archivo.
Un objeto JFrame es una ventana más utilizado para diseñar formularios. Vamos a
proceder hacer comparaciones con el objeto JDialog:
• Si instanciamos un JFrame en la barra de abajo de windows (creo que se llama
"barra de herramientas") nos aparece un nuevo "botoncito" correspondiente a
nuestra aplicación. Si instanciamos un JDialog, no aparece nada.
• Un JFrame tiene un método setIconImage() para cambiar el icono por
defecto de la taza de café. JDialog no tiene este método.
• Un JDialog admite otra ventana (JFrame o JDialog) como padre en el
constructor. JFrame no admite padres.
• Un JDialog puede ser modal, un JFrame no.
aplicación y sólo debe haber una. Nos permite cambiar el icono y sólo debe haber un
botón en la barra de herramientas de windows para nuestra aplicación.
Si usamos un JDialog como ventana principal, no tenemos botón en la barra de
herramientas y no hay forma fácil de cambiarle el icono.
Los JDialog son ideales para ventanas secundarias porque admiten una ventana
padre. Si la VentanaA es padre del JDialogB, entonces el JDialogB siempre estará por
delante de VentanaA, nunca quedará por detrás. Lo ideal es que hagamos nuestras
ventanas secundarias como JDialog cuyo padre sea el JFrame principal. De esta
forma los JDialog siempre serán visibles por encima del JFrame y no se irán detrás
ni quedarán ocultos por el JFrame.
Otra ventaja de admitir un padre es que heredan el icono de él. Si hemos cambiado el
icono del JFrame con el método setIconImage(), entonces todos los JDialog que
hagamos como hijos de este JFrame heredarán el icono. Todas las ventanas de
nuestra aplicación tendrán el mismo icono en lugar de la taza de café por defecto.
Entonces, ¿cómo hacemos?. Para que java no haga cosas raras, el padre del segundo
JDialog modal debe ser el primer JDialog modal. De esta forma, el segundo tiene
"prioridad" sobre el primero. Todo queda deshabilitado excepto este segundo JDialog.
Cuando lo cerremos, será el primero el que mande. Si queremos varias ventanas
modales simultáneamente en pantalla, cada ventana que se muestre debe ser padre
de la siguiente, de forma que la cadena de ventanas modales sean padre, hijo, nieto,
etc. Tener dos ventanas modales simultaneas que sean hermanas o primas o cualquier
otra relación que no sea directa, nos dará problemas
Aplicación 1
Vamos a proceder a crear un formulario donde se hará uso del objeto JDialog para
mostrar un mensaje dentro de un objeto de control JtextArea.
Solución:
1. Procedemos a crear un proyecto denominado SwingWindows.
Luego dar click en el botón de comando Finish (en caso de que la versión de
NetBeans es en castellano entonces dar click en el botón de comando
Terminar)
2. Estando en el entorno de NetBeans, seleccionamos el paquete swingwindows
y dando click botón derecho del mouse, se muestra un menú flotante, donde
seleccionamos Formulario Jframe.
4. Procedemos a programar
package swingwindows;
import javax.swing.*;
import java.awt.*;
Objeto JFileChooser
En Java tenemos varias formas para leer y escribir ficheros de textos, binarios, de
formato xml, etc. La clase JFileChooser permite mostrar una ventana para que el
usuario nevegue por los directorios y elija un archivo.
Para pedir un archivo para abrirlo y leerlo basta hacer dos líneas de programación:
JFileChooser fileChooser = new JfileChooser();
int seleccion = fileChooser.showOpenDialog(areatexto);
Este código abre una ventana para navegar en directorios y eligir un fichero.
Aplicación 2
Vamos a proceder a crear una aplicación donde usaremos el JFrame,JDialog,
JTextArea, y JFileChooser para hacer lectura de un archivo texto seleccionado y
abierto desde un JFileChooser.
Solución:
1. Procedemos a crear un proyecto denominado PruebaJFileChooser.
Luego dar click en el botón de comando Finish (en caso de que la versión de
NetBeans es en castellano entonces dar click en el botón de comando
Terminar).
2. Todo proyecto creado crea por defecto un archivo main de extensión java.
Haremos uso de este archivo para lo cual colocaremos el siguiente código.
package pruebajfilechooser;
import javax.swing.*;
import java.io.*;
import java.awt.*;
/**
*
* @author Usuario
*/
public class Main {
/** Creates a new instance of Main */
public Main() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)throws IOException {
JTextArea area= new JTextArea();
JDialog dialog;
JFrame formulario = new JFrame();
dialog = new JDialog(formulario, "", true);
dialog.setTitle("Mostrar Archivo");
//se instancia la variable fileChooser del tipo JFileChooser
JFileChooser fileChooser = new JFileChooser();
//con el método showOpenDialog() se muestra la ventana para seleccionar el
archivo
int seleccion = fileChooser.showOpenDialog(area);
//si el usuario selecciona el botón de comando Abrir, el if se hace verdadero
if (seleccion==JFileChooser.APPROVE_OPTION)
{