Este ejercicio hace la simulación de un formulario que hace una consulta, la cual se demora en la "búsqueda" por lo que aparenta que el formulario está colgado pues una vez presionado el botón no podemos seleccionar ningún elemento del ComboBox.
package hilos2;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
/**
*
* @author PauloGT
*/
public class Ventana extends Frame {
private JButton boton;
private JComboBox combo;
public Ventana(){
setLayout(new FlowLayout());
add(boton=new JButton("Este duerme el proceso: "));
boton.addActionListener(new EscuchaBoton());
add(combo=new JComboBox());
combo.addItem("Item 1");
combo.addItem("Item 1");
combo.addItem("Item 1");
setSize(300,300);
}
class EscuchaBoton implements ActionListener{
@Override
public void actionPerformed(final ActionEvent arg0) {
// Simulación de que hace la consulta y se demora
try {
Thread.sleep(10000);
System.out.println("Finalizo el proceso.. ");
} catch (final InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
El main de nuestra aplicación sería:
public static void main(String[] args) {
// TODO code application logic here
Ventana obj=new Ventana();
obj.setVisible(true);
}
Para Solucionar este tipo de problemas debemos usar hilos, por lo que necesitamos simplemente cambiar el código de nuestro programa de la siguiente manera:
package hilos2;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
/**
*
* @author PauloGT
*/
public class Ventana_1 extends Frame {
private JButton boton;
private JComboBox combo;
public Ventana_1(){
setLayout(new FlowLayout());
add(boton=new JButton("Este duerme el proceso: "));
boton.addActionListener(new EscuchaBoton());
add(combo=new JComboBox());
combo.addItem("Item 1");
combo.addItem("Item 1");
combo.addItem("Item 1");
setSize(300,300);
}
class EscuchaBoton implements ActionListener{
@Override
public void actionPerformed(final ActionEvent arg0) {
boton.setEnabled(false);
TareaBoton t=new TareaBoton(); // Creamos una instancia de la clase Hilo que creamos
t.start(); // ejecutamos el hijo
}
}
class TareaBoton extends Thread{
// creamos una innerclass que derive de los Hilos y manejamos todo lo que deseamos realizar en el método run.
public void run(){
try {
Thread.sleep(10000);
System.out.println("Finalizo el proceso.. ");
} catch (final InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Con esto nuestra aplicación no tendrá el problema de que aparenta estar congelado!!!
Cualquier novedad pueden hacer sus comentarios.