Capturar webcam con VB.NET

¿Que haremos? Crearemos una aplicación en Visual Studio, la cual hará uso de una webcam para capturar el video en frames independientes y depositarlos en memoria para despues mostralos al usuario a través de un picturebox y un Timer para crear la ilusión de movimiento. ¿Porque lo haremos? Porque es justo y necesario ¿Que necesitamos? [...]

Envío de correo con JavaMail/Netbeans

JavaMail es una expansión de Java que facilita el envío y recepción de e-mail desde código java. JavaMail implementa el protocolo SMTP (Simple Mail Transfer Protocol) así como los distintos tipos de conexión con servidores de correo -TLS, SSL, autentificación con usuario y password, etc [Según SantaWikipedia] ¿Qué necesitamos? JavaMail 1.4.5 Java y Netbeans 6.9 [...]

Proyecto de base de datos Firebird VB

En este proyecto realizaremos una aplicación de base de datos Firebird con el lenguaje de programación de Visual Basic de Microsoft, este proyecto tendrá las funciones básicas de gestión INSERT, DELETE, UPDATE y una interfaz de usuario para utilizarlas. ¿Que necesitamos? Visual Studio 2008 o superior Firebird última versión Firebird ADO.NET Data Provider. Conocimientos básicos [...]

Imprimir imagen con Print

La siguiente clase hace uso de PRINT para imprimir una imagen que se encuentra en un variable de tipo FileInputStream, esta clase a su vez es implementada desde una interfaz que hace fácil su uso, la clase así como todo el proyecto esta comentado. import java.io.File; import javax.print.Doc; import java.io.IOException; import javax.print.DocFlavor; import javax.print.SimpleDoc; import java.io.FileInputStream; [...]

Code Army Bolivia

14/4/10

[Respuesta] Cerrar JOptionPane automaticamente

JAN29

Bueno tratando de dar una respuesta "aceptable" a la pregunta de visitante a mi blog, que tenia o tiene la duda de "como cerrar automaticamente un JOptionPane transcurrido un cierto tiempo",  problema que me parecio sencillo al principio, controlar el tiempo no habia problema, con un Timer basta y sobra, pero despues de investigar un poco no encontre un comando en java para cerrar el JOptionPabe, el hide() no me funciono, el dispose() no existe para esta clase, el setvisible() no jala, asi que quedandome sin opciones, recorde un consejo de un viejo amigo, "cuando tengas un problema que al parecer no tiene solucion, da un paso atras para ampliar tu vision y asi encontraras la solucion mas facilmente",asi que ampliando mi mundo y  mirando mejor mi problema, busque una solucion alternativa, hice uso de la clase Robot, esta clase simula acciones que puede realizar el usuario como pulsaciones de taclas o movimientos del raton e incluso clics del mismo raton, puede no ser la mejor solucion, pero funciona.

El ejemplo que realice para esta demostracion, es una aplicacion trivial, que muestra una pregunta en un JOptionPane y desaparece despues de un tiempo.

La clase en cuestion, la llame "tictac.java", si lo se, soy un asco para colocar nombres  mis clases, pero bueno, esta clase tiene el metodo mostrar_pregunta(String p, int d).  recibe como parametros la pregunta en cuestion y el tiempo en segundos que se desea mostrar el JOptionPane en pantalla, pasado este tiempo, que es controlado por el metodo Comenzar_a_contar(), el JOptionPase se cerrara automaticamente haciendo uso de la clase Robot, que simula la presion de la tecla escape KeyEvent.VK_ESCAPE, la respuesta se almacena en una variable de tipo String "respuesta", para su uso posteriormente.

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class tictac {
//para la animacion    
private Timer tiempo ;
private TimerTask task;
//para almacenar la respuesta
private String respuesta=null;
private int duracion = 3;//tiempo
private JFrame padre;
private boolean isrun=false;

    public tictac(){
    }
    
    public void mostrar_pregunta(String p, int d){
        this.duracion = d;
        //comienza a contar el tiempo
        Comenzar_a_contar();
        //se muestra el JOptionPane
        this.respuesta = JOptionPane.showInputDialog(this.padre, p , JOptionPane.QUESTION_MESSAGE);
        //si contesto antes de que acabe el tiempo
        if(isrun){
            detener();
            actualizar();
        }       
        //System.out.println("Respuesta " + this.respuesta);
    }
    
    /* se ejecuta cuando acaba el tiempo */
    public void time_is_over(){    
        try {    
            Robot robot = new Robot();
            //se asigna una respuesta vacia
            this.respuesta = "No tengo idea";
            // se actualiza
            actualizar();
            //se presiona la tecla escape
            robot.keyPress(KeyEvent.VK_ESCAPE);
        } catch (AWTException ex) {
            Logger.getLogger(tictac.class.getName()).log(Level.SEVERE, null, ex);
        }         
    } 
    
    /* actualiza los objetos del frame padre */
    public void actualizar(){
     //se añade la respuesta al objeto label de miframe
      miframe.lbRes.setText("Respuesta: " + this.respuesta);
      miframe.lbtiempo.setText("0");
      miframe.lbRes.repaint();   
    }
    
    /* metodo que lleva el tiempo disponible para contestar*/
    public void Comenzar_a_contar() {   
           isrun=true;
           tiempo = new Timer();
           task = new TimerTask() {
               int contador=0;
               public void run() {
                   contador++;
                   miframe.lbtiempo.setText(String.valueOf(contador));
                   System.out.println("tiempo transcurrido: " + contador);
                   if(contador == duracion){
                        System.out.println("Se acabo el tiempo, mala suerte");
                        time_is_over();
                        detener();
                   }
               }    
           };        
           tiempo.schedule(task,0,1000);    
    }
    
    /* detiene la animacion */
     public void detener() {   
            isrun=false;
            tiempo.cancel();
            task.cancel();
    }        
}

Este metodo tiene un contra, la aplicacion tiene que estar siempre visible, caso contrario no funciona, la clase robot realiza la pulsacion de la tecla escape, pero con la aplicacion que se encuentre en primer plano, al perder el foco la aplicacion en java, pierde el evento de pulsacion y el JOptionPane continuara visible.

Asi que como respuesta alternativa, puede utilizarse un JFrame que tenga la apariencia de un JOptionPane, si no es estrictamente necesario utilizar la clase JOptionPane, el funcionamiento es el mismo, con la diferencia de que ya no es necesario el uso de la clase Robot para cerrar el objeto, ya que un Jframe cuenta con el metodo dispose() para cerrar la ventana.

El video para mas detalles


y no puede faltar el codigo fuente, en Netbeans 6.0

6 comentarios:

Eduardo dijo...

Muchas gracias, me fue de gran ayuda el código, funciona a la perfección.

Anónimo dijo...

Excelente!
gracias por el aporte!
muy bueno!

Mouse dijo...

de nada :)

Me dijo...

Gracias me sirvio el robot :)

Unknown dijo...

Gracias, gracias, estaba buscando esto, me ha servido mucho. Dios los bendiga,

Unknown dijo...

MUCHAS GRACIAS!!!!
estuve dias pensando en dar una solucion a SALIR DE UN JOPTIONPANE y gracias a ti ya tengo un solucion.
SALUDOS y sigue adelante con este blog

Post recomendado