Como hacer una carrera de barras de carga en JAVA usando hilos

Escrito por Ingridh R. Rodriguez P.

En nuestra primer curso enseñaremos como crear una carrera de barras de carga en JAVA usando hilos.

De una forma sencilla enseñaremos como los hilos facilitan el uso varios procesos para simular una carrera, donde cada una de las barras se llenan con números aleatorios hasta que todos terminen..

1

Primero tenemos que crear el interfaz gráfico para eso crearemos una clase que heredera de JFrame

2.PNG

La clase RunnerBar sera entonces una ventana que también ejecutara el main para que el programa inicie. Después creado la clase, entonces tenemos que agregar elementos a la ventana, necesitaremos un botón que iniciara la carrera

4

Después agregamos dos etiquetas para el titulo que sera en este caso: «Carrera de las olimpiadas», aunque si quieren pueden cambiarlo a uno que deseen, y otra etiqueta que dirá «finalistas»

5

Para guardar la lista de los nombres de los países haremos dos arreglos de etiquetas, una para la lista de países compitiendo y otra que se llenara mediante otro hilo que haremos mas adelante con los nombres de los mismos países pero en orden de llegada

6

JLabel [] names guardara los paises y JLabel [] finalistas guardara los países en el orden en que van llegando.

También necesitaremos un arreglo de barras de carga que serán las que simularan la carrera de cada participante 7

Una ves creado las variables hay que crear tres paneles donde irán cada uno de esos elementos en la ventana

8.PNG

También definimos una variable del tipo INT que se llamara tam y su valor sera 10, este sera un tamaño por defecto que usaran los elementos en sus respectivos paneles, y para agregarle una acción al botón GO, haremos que la clase implemente métodos de la clase Runnable

9

Para definir las variables y los elementos dentro de cada panel, se hará el método lauchWindows, que tendrá que ser llamado para que los elementos se muestren una vez iniciado el programa

10

Para que la carrera inicie usaremos el método implementado por Runnable y en este se crearan los hilos que harán que cada barra se llene por separado, como un sub proceso cada uno

11

Antes de todo esto, es necesario crear otro método, que como verán en el código anterior es el método que llena la listas de países «country=seleccionador();»

12.PNG

Y para terminar con la clase ponemos el respectivo método main con el llamado a el método lanzador

13

Para que los hilos funcionen entonces se creara la clase Hilo que heredera de Thread

public class Hilos extends Thread

Esta clase tendrá un constructor que recibirá los elementos enviado desde la clase Runnerbar para poder hacer correr bien el proceso

14

Todo Hilo para poder correr debe tener el método Run, método que contendrá los procesos que hará el hilo una vez sea iniciado, este método llenara las barras de proceso de cada hilo usando métodos aleatorios como Math.random y para que se aprecie el llenado se usara un método sleep.

15

Y para llenar la tabla de los finalistas crearemos otra clase el cual llamaremos tablaFinal y que también heredara de Thread

class tablaFinal extends Thread{

Esta clase recibirá elementos como los hilos anteriores para saber quien termina primero el tamaño, el arreglo de nombre de los países y el botón de GO, para saber cuando detenerlo

16

Y en el método run estará pendiente de que hilo termina primero para ponerlo en orden de llegada en la ventana, de esta manera:

17

Y con esto al final tendremos el siguiente programa corriendo de la siguiente manera:

Para finalizar compartiremos todo el codigo para que puedan ponerlo a prueba:

public class RunnerBar extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
private JPanel RunnerPanel, nombres,finalistasPanel;
private static int tam=10;
private JButton go;
private JLabel titulo,finalistasTitulo;
private static JLabel [] names;
private static JLabel [] finalistas;
private static JProgressBar [] bar;
private Color ColorPorDefecto;
//——————————————————————————-Constructor
public void launchWindows(){
setLayout(null);
finalistasTitulo=new JLabel(«Finalistas!»);
titulo=new JLabel(«CARRERA DE LAS OLIMPIADAS»);
go=new JButton(«GO!»);
bar = new JProgressBar[tam];
names= new JLabel[tam];
finalistas= new JLabel[tam];
//Font s = titulo.getFont();
titulo.setFont(new Font(«Comic Sans MS»,Font.BOLD,20));

//C,F,ESPACIOHORIZONTAL,ESPACIOVERTICAL
RunnerPanel=new JPanel(new GridLayout(tam,1,1,11));
nombres=new JPanel(new GridLayout(tam,1,1,11));
finalistasPanel= new JPanel(new GridLayout(tam,1,1,1));

go.addActionListener(this);

for(int i=0;i<tam;i++){
bar[i] = new JProgressBar();
RunnerPanel.add(bar[i]);
names[i] = new JLabel(«…»);
nombres.add(names[i]);
finalistas[i] = new JLabel(«»);
finalistasPanel.add(finalistas[i]);
}

titulo.setBounds(325, 25, 500, 30);
finalistasTitulo.setBounds(750, 100, 70, 20);
go.setBounds(75, 100, 70, 20);
nombres.setBounds(75, 130, 90, 300);
RunnerPanel.setBounds(200, 130, 500, 300);
finalistasPanel.setBounds(750, 130, 200, 250);
add(titulo);
add(finalistasTitulo);
add(nombres);
add(RunnerPanel);
add(finalistasPanel);
add(go);

ColorPorDefecto=bar[0].getForeground();

setTitle(«Enviador»);
setSize(1000,519);
setVisible(true);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//——————————————————————————Aciones de boton
public void actionPerformed(ActionEvent e) {
go.setEnabled(false);
for(int i=0;i<tam;i++){
finalistas[i].setText(«»);
bar[i].setStringPainted(true);
bar[i].setForeground(ColorPorDefecto);
bar[i].setString(«»);
}

String [] country = new String[tam];
country=seleccionador();

for(int i=0;i<tam;i++){ names[i].setText(country[i]); }

//HilosColorXpais [] hilos = new HilosColorXpais[tam];
Hilos [] hilos = new Hilos[tam];

//for(int i=0;i<tam;i++){ hilos[i]= new HilosColorXpais(bar[i],country[i]); }
for(int i=0;i<tam;i++){ hilos[i]= new Hilos(bar[i],country[i],i); }
for(int i=0;i<tam;i++){ hilos[i].start(); }

tablaFinal fin = new tablaFinal(finalistas,hilos,tam,go);
fin.start();
}
//——————————————————————————————Metodo
private String[] seleccionador(){
String namesCountry[] = {«Argentina»,»Panama»,»Brasil»,»United States»,»Mexico»,»United Kingdom»,
«Canada»,»Venezuela»,»Alemania»,»China»,»Jamaica»,»Somalia»,»Barbados»,»Kenia»,»Etiopia»,»Sudafrica»,
«Australia»,»Japon»,»Uganda»,»Francia»,»Tanzania»,»Letonia»,»Honduras»,»Haiti»,»Portugal»,»Israel»,
«Egipto»,»Russia»,»Tri.Tobago»,»Noruega», };
String [] country = new String[tam];

for(int i=0;i<tam;i++){ country[i]=namesCountry[ ((int) (Math.random()*(0-29)+29)) ]; }
return country;
}
//=================================================================MAIN============================
public static void main(String [] args){
RunnerBar o = new RunnerBar(); o.launchWindows();
}

}//FIN CLASE

 

public class Hilos extends Thread{
private JProgressBar bar;
private String pais,fin=null;
private int colors;
private Color [] colores={Color.BLUE,Color.CYAN,Color.GRAY,
Color.GREEN, Color.MAGENTA, Color.ORANGE,
Color.PINK,Color.RED,Color.WHITE,Color.YELLOW};

public Hilos(JProgressBar bar,String pais,int colors){
this.bar = bar;
this.pais = pais;
this.colors = colors;
}

public void run() {
bar.setStringPainted(true);
int y=0, t=0;
bar.setForeground(colores[colors]);
while(y<=100){
t=(int)(Math.random()*(3-10)+10);
y=y+(int)(Math.random()*(1-5)+5);
bar.setValue(y);
bar.repaint();
if(y!=100){
try{Thread.sleep( t*100 );} catch (InterruptedException e){} }
}

bar.setForeground(Color.BLACK);
bar.setString(pais+» finalizo!»);
fin=pais;
}

public String yaFinalizo(){ return fin; }

public void stopFinalizo(){ fin=null; }

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class tablaFinal extends Thread{
public JLabel [] finalistas;
public Hilos [] hilos;
//public HilosColorXpais [] hilos;
int tam;
public JButton go;

//public tablaFinal(JLabel[] finalistas,HilosColorXpais [] hilos, int tam, JButton go)
public tablaFinal(JLabel[] finalistas,Hilos [] hilos, int tam, JButton go)
{
this.go = go;
this.finalistas= new JLabel[tam];
this.finalistas=finalistas;
this.hilos = hilos;
this.tam=tam;
}

public void run() {
Font s = finalistas[0].getFont();
int x=0;
while(x<10){
for(int i=0;i<tam;i++){
if(hilos[i].yaFinalizo()!=null){

if(x==0){
finalistas[x].setForeground(Color.ORANGE);
finalistas[x].setFont(new Font(s+»»,Font.BOLD,24)); }

if(x==1){
finalistas[x].setForeground(Color.GRAY);
finalistas[x].setFont(new Font(s+»»,Font.BOLD,19)); }

if(x==2){
finalistas[x].setForeground(new Color(159, 80, 0));
finalistas[x].setFont(new Font(s+»»,Font.BOLD,16)); }

finalistas[x].setText((x+1)+». «+ hilos[i].yaFinalizo());
hilos[i].stopFinalizo();
x++;
}
}
}
go.setEnabled(true);
}
}

 

MUCHAS GRACIAS!