Mostrando entradas con la etiqueta Soluciones. Mostrar todas las entradas
Mostrando entradas con la etiqueta Soluciones. Mostrar todas las entradas

domingo, 6 de abril de 2008

Ejercicio 1. Solución: Contador

Continuamos con la solución: Para poder crear una lista de números nos valdremos de un sencillo arreglo de cadenas que sea una variable de clase; además agregaremos una bandera para indicar si el proceso debe seguir contando.


public class Exercise1 extends JFrame {
private JLabel numberLabel = null;
private JButton stopButton = null;
private boolean shouldContinue = true;

private static String[] numbers = new String[] {"1", "7", "15", "3", "9", "0"};

//Mas contenido
}


Después vamos a crear una clase que implemente Runnable para poder convertir el proceso de conteo en un hilo, la clase quedaría como una clase interna más o menos así:


class Counter implements Runnable {
private int index = 0;

public void run() {
while(shouldContinue) {
if(index == numbers.length)
index = 0;
numberLabel.setText("" + numbers[index++]);
try {
Thread.sleep(500);
} catch(InterruptedException ie) { ; }
}
};
}


Agregamos al constructor de la clase un método para arrancar el ciclo, y al botón un método para detenerlo:


stopButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
shouldContinue = false;
}
});

new Thread(new Counter()).start();


La solución estaría completa.

Para seguir...



  1. Describe el método usado para evitar errores cuando el proceso del contador duerme.

  2. ¿Qué ventajas y desventajas presenta el hecho de declarar la seríe de números estática?

  3. ¿Porqué nunca se llama al método run del contador?

  4. Elabore una lista con las formas de llamar al método deriveFont.

  5. Describe como podría implementarse la clase del contador dentro del constructor de la solución.

  6. Describe como podría implementarse la clase ActionListener del botón fuera del constructor.

  7. Implemente un método para que la lista de valores se llene de manera aleatoria.



Clase completa



import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class CounterSolution extends JFrame {
private JLabel numberLabel = null;
private JButton stopButton = null;
private boolean shouldContinue = true;

private static String[] numbers = new String[] {"1", "7", "15", "3", "9", "0"};

class Counter implements Runnable {
private int index = 0;

public void run() {
while(shouldContinue) {
if(index == numbers.length)
index = 0;
numberLabel.setText("" + numbers[index++]);
try {
Thread.sleep(500);
} catch(InterruptedException ie) { ; }
}
};
}

//Sobreescribimos el constructor para darle un titulo al frame
public CounterSolution() {
super("Ejercicio 1");

numberLabel = new JLabel(" ", JLabel.CENTER);
stopButton = new JButton("Detener");

//Recuperamos la fuente de la etiqueta
Font font = numberLabel.getFont();
//Recreamos la fuente con un tamaño de 32 puntos
font = font.deriveFont(32.0f);
//Establecemos la fuente nueva de la etiqueta
numberLabel.setFont(font);

stopButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
shouldContinue = false;
}
});

this.setLayout(new BorderLayout());
this.add(numberLabel, BorderLayout.CENTER);
this.add(stopButton, BorderLayout.PAGE_START);

//Ajustamos la ventana para el tamaño de los componentes
this.pack();
//Mostramos la ventana
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

new Thread(new Counter()).start();
}

public static void main(String[] args) {
new CounterSolution();
}
}

miércoles, 26 de marzo de 2008

Ejercicio 1: Diseño de la ventana

Descripción



Desarrollar un programa que muestre una secuencia de numeros determinada (1, 2, 3, 4, 5, 7) de manera constante e infinita (después de mostrar un 7 deberá mostrar un 1, 2, 3). Los datos deben mostrarse en una ventana en el centro de la misma como un texto grande y poseer un botón para detener el conteo y la secuencia.

Solución propuesta



Comenzemos por la parte más aburrida desde mi punto de vista: Crear la interfaz, para esto yo se que hay herramientas pero prefiero hacerlo a mano. Para esto necesitamos una ventana, un texto grande y un botón, así que usaremos un JFrame, un JLabel y un JButton.


public class Exercise1 extends JFrame {
private JLabel numberLabel = null;
private JButton stopButton = null;

//Sobreescribimos el constructor para darle un titulo al frame
public Exercise1() {
super("Ejercicio 1");

numberLabel = new JLabel(" ");
stopButton = new JButton("Detener");
}
}


Ahora continuemos con la apariencia de la etiqueta, necesitamos que sea un texto grande


//Recuperamos la fuente de la etiqueta
Font font = numberLabel.getFont();
//Recreamos la fuente con un tamaño de 32 puntos
font = font.deriveFont(32.0);
//Establecemos la fuente nueva de la etiqueta
numberLabel.setFont(font);


Ordenamos los elementos dentro de la ventana. A mi me parece un modelo muy aplicable a un BorderLayout


this.setLayout(new BorderLayout());
this.add(numberLabel, BorderLayout.CENTER);
this.add(stopButton, BorderLayout.PAGE_START);


Y finalmente mostramos el contenido de la ventana


//Ajustamos la ventana para el tamaño de los componentes
this.pack();
//Mostramos la ventana
this.setVisible(true);