A la quinta va la vencida
como dos personas intentan aprobar OCAPráctica 12 (23-05-08)
Día 12, práctica doce.
Aqui volvemos a nuestra cita con el blog. Vale, si, ha estado descuidado cosa de 15 días pero esperamo que entendais queridos amigos que hemos estado bastante atareados como suponemos que lo hayais estado vosotros.
Después de esta pequeña disculpa pasamos a exponeros la práctica 12 y pese a lo que a lo mejor queriais lo vamos a hacer un poco “por encima”. Más detalles tendreis en otras asignaturas posteriores por lo que os explicaremos cosas básicas y para el que quiera hacer algo más avanzado ya sabeis, paciencia, no hay otra ciencia.
Para la creación de reproductores es necesario la utilización de la denominada JMF(Java Media Framework). En nuestro caso queremos crear un reproductor en una ventana y que tenga alguna opción de control. Podemos utilizar 4 clases: Final, Reproductor, Interfaz y Reloj.
- La clase Final será la que inicialice todo y solamente contendrá el main().
- La clase Reloj implementa aspectos correspondientes al tiempo de la reproducción y su visualizacion.
- La clase Interfaz será la que cree la ventana y todos sus componentes: JMenuBar, JMenu, JScrollBar, JLabel y JButton.La apariencia de la interfaz es esta:

Además esta clase es la que gestiona los eventos generados por los comandos de la interfaz.
– La clase Reproductor que sera la que contenga los métodos de respuesta a los eventos antes citados y a los eventos generados por el player. Como métodos descripitivos citaremos:
-
inicializar(URL url)
try{
mdPlayer = Manager.createPlayer(u); //Manager es clase “factoria” para el resto
mdPlayer.addControllerListener((ControllerListener) this);
mdPlayer.realize(); //pasa el player a estado realizado
}catch(IOException e){}
catch(NoPlayerException e){}
- iniciar()
if (mdPlayer != null){
Ï mdPlayer.start(); //comienza la reproduccion
}
- parar()
if(mdPlayer!= null){
ÏÏ mdPlayer.close(); //cierra el player por completo
ÏÏ }
- esperar()
if(mdPlayer!= null){
ÏÏÏ mdPlayer.stop(); //para la reproduccion
ÏÏ }
- avanzar()
ÏÏÏ Time time=mdPlayer.getMediaTime(); //obtiene el tiempo de medio
ÏÏ double segundos=time.getSeconds()+5;
ÏÏÏ Time newtime=new Time(segundos);
ÏÏÏ mdPlayer.setMediaTime(newtime); //situa la reproduccion en el tiempo indicado
ÏÏ Ï}
-
retroceder() (Similar al anterior pero restando 5 segundos)
- setTiempo(it segundos) (Similar al avanzar pero especificando el tiempo)
- setCallar(boolean valor)
if(valor==true){
ÏÏÏmdPlayer.getGainControl().setMute(true); //obtiene control de ganacia y pone mute
Ï Ï}
ÏÏ else{
ÏÏÏmdPlayer.getGainControl().setMute(false);
ÏÏ }- setRate(float valor)
if(valor==0.5f){
ÏÏ mdPlayer.setRate(valor); //coloca la tasa al valor
ÏÏ }
Ï Ïif(valor==1f){
ÏÏ mdPlayer.setRate(valor);
ÏÏ }
ÏÏ if(valor==2f){
ÏÏ mdPlayer.setRate(valor);
ÏÏ }- setVolumen(int porcentaje)
level=(float)porcentaje/100;
ÏÏ mdPlayer.getGainControl().setLevel(level); //obtiene el control de ganacia y coloca el nivel a lo indicadoAdemás esta clase gestiona en el controllerUpdate muy simplemente los eventos del player y que son: RealizeCompleteEvent, PrefetchComplteEvent y EndOfMediaEvent.
Esperemos que no os haya aburrido mucho y que os haya servido de ayuda esta pequeña explicación de una aplicación Java que integra la JMF. Sin mas nos despedimos hasta la próxima entrada (ya nos quedan pocas) que creemos sea la del juego “Tetris 2008″.
Un saludo.Lidia y Carlos
Práctica 11 (16-05-2008)
Día once, práctica once.
Otro día más y otro menos, para que llegue el examen, hoy toca revisar nuestros conocimientos acerca de los eventos….primero el profe hace una introducción acerca de que son y para que sirven.
Pues bien, un evento sirve para realizar acciones mediante, teclado, ratón
Ejercicio 1:
Nos piden que hagamos un programa que tenga un botón que cada vez que se pulse imprima un texto por la salida estándar.
public class Simple00GUI extends JFrame implements ActionListener{
public Simple00GUI(){
JFrame frame = new JFrame(“Evento Botón”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton b= new JButton(“Boton”);
//botón escuchador
b.addActionListener(this);
frame.getContentPane().add(b,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
public void actionPerformed(ActionEvent evento){
System.out.println(“Boton pulsado”);
}
public static void main (String args[]){
Simple00GUI s= new Simple00GUI();
}
}
Ejercicio 2:
class SimpleGui01 extends JFrame implements ActionListener{
JLabel etiqueta;
public SimpleGui01(){
JFrame frame = new JFrame(“Simle 01″);
etiqueta=new JLabel(“Etiqueta”);
etiqueta.setOpaque(true);
etiqueta.setBackground(Color.MAGENTA);
JButton boton=new JButton(“Púlsame”);
boton.addActionListener(this);
JPanel panel=new JPanel();
panel.setLayout(new GridLayout(2,1));
panel.add(boton);
panel.add(etiqueta);
frame.getContentPane().add(panel);
frame.setVisible(true);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
}
public void actionPerformed(ActionEvent e){
if(etiqueta.getBackground().equals(Color.MAGENTA)){
etiqueta.setBackground(Color.CYAN);
}
else{
etiqueta.setBackground(Color.MAGENTA);
}
}
public static void main(String args[]){
SimpleGui01 gui=new SimpleGui01();
}
Ejercicio 3.
Este nos llevo un poco más de tiempo, pues nosotros queríamos hacer con eventos, lo de de leer por pantalla, pero el profesor nos sugirió este camino, pues era más sencillo. Así pues el resultado fue:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
class SimpleGui02 extends JFrame implements ActionListener{
JLabel label;
public SimpleGui02(){
super(“simple”);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel panel=new JPanel();
panel.setLayout(new GridLayout(2,1));
label= new JLabel(“Etiqueta”);
label.setOpaque(true);
label.setBackground(Color.PINK);
JButton boton=new JButton(“Púlsame”);
boton.addActionListener(this);
panel.add(boton);
panel.add(label);
this.getContentPane().add(panel);
this.setVisible(true);
this.pack();
}
public void actionPerformed(ActionEvent e){
cambiaColor();
}
public void cambiaColor(){
if(label.getBackground().equals(Color.PINK)){
label.setBackground(Color.red);
System.out.println(Thread.currentThread().getName() +
“: <enter> detected… cambio de color”);
}
else{
label.setBackground(Color.PINK);
}
}
public static void main(String args[])throws IOException{
SimpleGui02 gui=new SimpleGui02();
InputStreamReader input = new InputStreamReader(System.in);
int c;
try {
while( (c=input.read())!= -1) {
if (c == ‘\n’) {
System.out.println(Thread.currentThread().getName()+
“: <enter> detected… “);
}
}
}
catch (IOException e) {
System.err.println(e);
System.exit(1);
}
}
}
Ejercicio 4.
Nos piden que hagamos un programa parecido al primero, pero que cuando se pulse cambia de color el botón y lo que nosotros hemos hecho es:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Simple03GUI extends JFrame implements ActionListener{
JButton boton;
public Simple03GUI(){
super(“Simple03Gui”);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
boton = new JButton(“Pulsame”);
boton.setOpaque(true);
boton.addActionListener(this);
this.getContentPane().add(boton,BorderLayout.CENTER);;
this.setVisible(true);
this.pack();
}
public void actionPerformed(ActionEvent e){
if(boton.getBackground().equals(Color.PINK)){
boton.setBackground(Color.CYAN);
System.out.println(Thread.currentThread().getName() +
“:cambio de color”);
}
else{
boton.setBackground(Color.PINK);
}
}
public static void main( String args []){
Simple03GUI s= new Simple03GUI();
}
}
Hasta el momento es todo lo que hemos hecho pero, aun así nos hemos puesto manos a la obra con los siguientes apartados, a lo largo de la semana modificaremos este post.
Un saludo.
Practica 10 (9-05-2008)
Día diez, práctica 10.
Comienza otro día más y ya queda menos, hoy toca una de hilos, y os preguntaréis, pero si esto no entraba no? pues bueno eso decían, pero como dice mi abuela no te creas ni la mitad de lo que te digan, que luego llegan los palos. Asi toca revisar los apuntes, porque en clase no hemos visto nada y echarle valor. Bueno también nos ayuda un poco el profe de prácticas, que la verdad se esfuerza bastante en que entendamos algo tan complicado en tan poquito tiempo.
Ejercicio1.
Más de lo de siempre te ponen, un programilla te dicen que lo inspecciones, que lo ejecutes y compiles a ver lo que hace. Pues bien la clase Ding! lo que hace es mostrar por pantalla (“DING”) cada vez que pulses la tecla de intro, para la realización de este programa tienes que importar java.io.IOException ya que estas leyendo por teclado, el segundo apartado es un programa que muestra por pantalla también (“DONG”) pero esta vez através de un Thread. El apartado 3 digamos que es la suma de los dos anteriores, pero al ejecutarlo nos damos cuenta que el programa no funciona bien, y esto segun comento el profesor puede ser que un mismo proceso no puede estar a dos cosas a la vez, vamos parecido a un chico que si esta viendo la tele no puede estar hablando con la novia, porque no se entera ni de una cosa ni de otra….es broma no os cabreis chicos…pero es que el simil era bueno para entender esto.
Ejercicio 2
Ahora nos metemos un poco más el asunto, y ya hablamos de hilos.Primero diremos que es un Thread, para aquellos que no lo sepaís, o dudeis en su significado:
-Thread, es un flujo simple de ejecución dentro de un programa. Hasta el momento, todos los programas creados contenian un único Thread, pero un programa (o proceso) puede iniciar la ejecución de varios de ellos. En los Threads lanzados desde un mismo programa, la memoria se comparte, utilizando el mismo contexto y recursos asigandos al programa. Un Thread no puede existir independientemente de un programa, sino que se ejecuta dentro de un programa o proceso.
Ahora mostramos lo que a nuestro parecer hace la clase TwoThreads:
Class TwoThreads {
public static void PrintThreadName() {
//Dame el nombre del thread que se está ejecutando
System.out.println(Thread.currentThread().getName());
}
//Se crea un objeto de la clase Runnable y se implementa su método run()
public static void main(String args[]) {
Runnable r =
new Runnable() {
public void run() {
PrintThreadName();
}
};
//Creamos un Thread donde se le pasa como parametro el obtejo de la clase Runnable
Thread t = new Thread(r);
//LLamamos al metodos star()
t.start();
PrintThreadName();
}
}
Bueno vamos a explicar algunas cosas en detalle:
-start(), es un método de la clase Thread, que sireve para iniciar la ejecución. La llamada al método start() asigna los recursos necesarios al objeto.
-run(), este método es llamado por el start(). Es el corazón de cualquier Thread y donde tiene ludar la acción del Thread
Una vez se inicia la ejecución del Thread, el tiempo de la CPU se reparte entre todos los procesos y Threads del sistema. con lo cuál, se intercambian instrucciones del método main() con intrucciones del método run() entre otras.
En el apartado dos, nos piden que veamos la diferencia entre el programa, TwoThreads y TwoThreadsSimple, en este segundo lo que hace es implementar el interface Runnable, y redefinir el método run() de esta interfaz, luego tan solo creariamos un Thread pasandole como parametro la propia clase , para que llamase a start().
TwoThreadsSimple tts = new TwoThreadsSimple();
Thread t = new Thread(tts);
t.start();
En el apartado tres lo que hace es extender de la clase Threads, así no tiene que crear un objeto y puede invocar el método star() desde el propio objeto de la clase
TwoThreadsSimple2 tts2 =new TwoThreadsSimple2();
tts2.start();
Ejercicio 3.
En este ejercicio, al ver el código que nos dan, pensamos que al ejecuatarse saldrían primero una tira de ceros y luego los unos, pero estabamos equivocados, ya que cuando utilizamos hilos, no sabemos el orden de ejecución como tampoco sabemos cuanto tiempo le va a dedicar a ese proceso, y esto lo que le sucede a este proceso.
La solución que nos dan en el siguiente apartado, emplea vectores, y por lo que hemos visto, lo que hace es meter en un vector las ordenes que le queremos dar y así sacarlas en el orden que queramos. No estamos muy seguros de esto, pero creemos que es así, de todas formas si nos equivocamos nos gustaria que los profes nos lo digeran, para no tener está idea equivocada.
Ejercicio 4
En el primer apartado nos dicen que hagamos un programa que que imprima por pantalla “WHITE”, 2 segundos después “BLACK”, 2 segundos después “WHITE” y así sucesivamente. Nosotros hemos hecho lo siguiente:
import java.io.IOException;
public class StroboscopicText {
String s;
public StroboscopicText(){
cambiar();
}
public void rotar(String s){
if(s.equals(“WHITE”)){
s=“BLACK”;
System.out.println(s);
}
}
public void cambiar(){
try {
while(true) {
Thread.sleep(2000);
s=“WHITE”;
rotar(s);
System.out.println(s);
}
}
catch (InterruptedException e) {
System.out.println(“Interrupted while sleeping”);
}}
Los siguientes apartados ya nos los llegamos hacer, pero si sacamos un rato, no dudeís que lo haremos y colgaremos aquí nuestros resultados.