jump to navigation

Práctica 10 Mayo 23, 2008

Posted by beceoca in Posts normales.
1 comment so far

 

La práctica trata sobre procesos e hilos.

 

En un principio se explica cómo funcionan los procesos abiertos en una CPU, ya que ésta dedica un tiempo a cada una de las tareas, dando la impresión de que está ejecutando todas a la vez.

La CPU intenta dar a todos los procesos el mismo tiempo.

Si la CPU tiene más procesos abiertos, dará menos tiempo a cada uno de ellos, y si un programa necesita más tiempo de dedicación por parte de la CPU del que ésta le proporciona se notará que comienza a ir lento o a trompicones.

 

El primer apartado de esta práctica es crear un programa que imprima un texto (DING!) cada vez que es pulsada la tecla INTRO

Necesitamos importar el paquete de excepciones java.io.IOException para posibles fallos de lectura del teclado

La clase tendrá como nombre Ding y contendrá únicamente el método main que a su vez contiene un try-catch para capturar el error lanzado por la aplicación en caso de fallo del teclado.

Dentro del try pondremos un while, que tendrá una condición (mientras sea cierto lo que contiene dentro del cuerpo), y dentro de éste un if cuya condición es que la lectura del teclado sea un intro, es decir: if(System.in.read() == ‘\n’)

Si esta condición se cumple imprimiremos en la consola el texto (DING!), en caso de algún error de teclado imprimiremos una línea de error.

 

La siguiente clase a programar fue la clase Dong que imprime por pantalla cada 1000ms  mediante el métoodo sleep la frase “Dong!”. También se introduce en un try-catch para capturar cualquier error que pueda surgir.

 

El siguiente ejercicio trata de juntar las dos clases anteriores, es decir, que cuando pulsemos INTRO salga “Ding!” y cuando pasen 1000ms salte la frase “Dong”.

Aquí comenzamos a tener el problema de los hilos, en el cual si estás atendiendo a un evento no puedes atender a otro a la vez. Atendemos al evento de dormir la ejecución y no podemos atender al del botón INTRO. Con lo cuál los dos eventos se imprimen por pantalla justo cuando pasa el tiempo entre las dos impresiones de la frase “Dong!”. Por supuesto debemos declarar los dos posibles errores.

 

Después de realizar estos ejercicios sobre hilos nos dedicamos a nuestro juego que es el Brain Training. Teníamos un problema, que se trataba de que habíamos declarado un array pero no lo habíamos creado, y por eso nos daba un error al ejecutar del tipo NullPointerException. También estuvimos intentando resolver el problema del timer, ya que no sabemos cúando pararlo y si pulsamos un botón antes de que se pase el tiempo permitido para ello, la siguiente vez tendremos menos tiempo para contestar la pregunta.

Práctica 9 Mayo 8, 2008

Posted by beceoca in Posts normales.
add a comment

Esta práctica es la primera que trata sobre interfaces gráficas (swing).

En los primeros 45 minutos, el profesor nos estuvo explicando cuándo y dónde debemos emplear las GUIs, ya que no siempre son necesarias.

Posteriormente nos metimos en “materia”, y comenzamos a realizar el ejercicio 1, que trata de crear un “hola mundo” de forma gráfica, creando una clase llamada HelloWorldGUI, en la que importamos varios paquetes necesarios para su posterior uso.
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
Creamos posteriormente un frame y le damos la función de salir en la X de la esquina superior derecha con las líneas de código:
JFrame frame = new JFrame(“HelloWorldGUI window title”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

y le añadimos un panel que contiene una etiqueta, en la que pone Hello World!.
JPanel contentPane = (JPanel) frame.getContentPane();
JLabel label = new JLabel(“Hello World!”);
contentPane.add(label);

Con estas otras dos líneas damos tamaño a la ventana y la hacemos visible por pantalla
frame.setSize(100,50);
frame.setVisible(true);

Posteriormente se pide crear una nueva clase llamada HelloWorldGUIBig que es igual a la anterior, pero con una ventana cuatro veces mayor. Eso se logra cambiando los valores que pasamos al método setSize(), en este caso sería

frame.setSize(400,200);

 

En otro de los apartados de este ejercicio se pide cambiar el color de la etiqueta por un color azul, para ello creamos otra clase con nombre HelloWorldGUIColor y al que añadimos estas líneas de código antes de la línea de setVisible():
label.setOpaque(true);
label.setBackground(Color.BLUE);

Debemos hacer la etiqueta opaca, ya que por defecto es transparente y posteriormente cambiarla al color que deseemos.

Ahora se crea otra clase llamada HelloWorldGUIDelayed, a la que añadiremos un código dado en el enunciado entre la llamada al método setSize y a setVisible y cuya función es parar el programa 10 segundos antes de su ejecución, con lo que al ejecutar el programa deberemos esperar 10 segundos antes de que aparezca algo por pantalla.
try {
       Thread.sleep(10*1000);
} catch (InterruptedException e) {                  
        System.err.println(“Unexpected interruption while sleeping:”);
        System.err.println(e);        
        System.exit(1);
}

En otro apartado se pide introducir el código System.exit(0); al final del método main, con resultado la salida directa del programa tras ejecutarlo.

 

 

El ejercicio 2 contiene una introducción teórica muy amplia sobre los manejadores de ventanas y los métodos que se pueden realizar sobre un frame.
Una vez mirado en el API los métodos a los que hace alusión el enunciado, nos pusimos “manos a la obra”.
El primer apartado “práctico” de este ejercicio nos pide realizar una clase llamada HelloWorldGUIDeaf que ignore el mensaje de cierre del manejador de ventanas, es decir, que cuando pulses la X de la esquina superior derecha no realice ninguna función. Esto se logra sustituyendo la anterior línea de código:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
por esta otra:
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
De esta forma la única manera de cerrar la ventana es con ctrl+C
El apartado 3  no tiene mayor misterio que añadir la línea de código
frame.setUndecorated(true);
antes de hacer visible el frame, eliminándose la barra de título y los marcos de toda la ventana, siendo posible cerrarla únicamente mediante el comando ctrl+C
En el último apartado no conseguimos ningún cambio, aunque creemos que basta con incluir la línea de código
f

rame.setDefaultLookAndFeelDecorated (true);

 

 

 

El ejercicio 3 trata de poner en práctica los conceptos de Layouts, que son “plantillas” para colocar los distintos componentes de una ventana.
En el primer y segundo apartado nos piden crear una clase de nombre CompassSimple que  sea igual que HelloWorldGUIColor pero que muestre la etiqueta en fondo negro, el texto blanco y la ventana maximizada al tamaño completo de la pantalla sin tener que apretar el botón para maximizarla. También debemos distribuir las etiquetas de esta manera:
Texto: “North    color del fondo: negro     color del texto: blanco
Texto: “South    color del fondo: blanco    color del texto: negro
Texto: “East    color del fondo: azul       color del texto: rojo
Texto: “West   color del fondo: rojo       color del texto: azul

 

El código para esta clase es el siguiente:

import javax.swing.*;
import java.awt.*;       
class CompassSimple  {

public static void main(String args[]) {

//Creamos la ventana, le damos título y utilidad a la X
JFrame frame = new JFrame(“HelloWorldGUI window title”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Creamos el panel y le añadimos a frame
JPanel contentPane = (JPanel) frame.getContentPane();

//Creamos las cuatro etiquetas con las características indicadas en el enunciado
JLabel label = new JLabel(“Hello World!”);
label.setOpaque(true);
label.setBackground(Color.BLACK);
label.setForeground(Color.white);

JLabel label1 = new JLabel(“Hello World!”);
label1.setOpaque(true);
label1.setBackground(Color.WHITE);
label1.setForeground(Color.black);

JLabel label2 = new JLabel(“Hello World!”);
label2.setOpaque(true);
label2.setBackground(Color.BLUE);
label2.setForeground(Color.red);

JLabel label3 = new JLabel(“Hello World!”);
label3.setOpaque(true);
label3.setBackground(Color.RED);
label3.setForeground(Color.blue);

//Damos bordes entre el panel y el contenedor principal, es decir, frame y añadimos todas las etiquetas en la posición del panel que les corresponde, maximizamos la pantalla al ejecutar el programa y la hacemos visible.
contentPane.setBorder(BorderFactory.createEmptyBorder(25,100,25,100));
frame.setLayout(new BorderLayout());
frame.getContentPane().add(label,BorderLayout.NORTH);
frame.getContentPane().add(label1,BorderLayout.SOUTH);
frame.getContentPane().add(label2,BorderLayout.EAST);
frame.getContentPane().add(label3,BorderLayout.WEST);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
}
}

 

No nos dio tiempo a realizar los demás apartados, ya intentaremos acabarla por nuestra cuenta y riesgo cuando tengamos algún rato libre, ya que el juego quita muchísimo tiempo.