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

28/3/10

Tarot virtual - Mouse responde

JAN29


Este programa lo hice para mi sobrino pequeño que hace unos dias atras llego muy sorpendido de su escuela y me conto que su amigo era "brujo" [risas], me conto que habian entrado a internet y que un amigo suyo hablaba con un programa y este le respondia correctamente todo lo que le preguntaba, le hacia preguntas como "quien esta a mi lado", "como se llama mi amigo", "como estoy vestido" y cosas por el estilo, claro todo esto no podia ser mas que un truco, asi que le pregunte cual era el nombre del juego y era "Pedro responde" LOL.

Este jueguito on-line, simula ser un "Tarot Virtual" con cierta IA y claro, como no podia ser de otra forma, tiene un truco con el cual puede "adivinar" cual quier cosa que le preguntemos.

El Truco:
El truco funciona de la siguiente manera:
Ingresar a la pagina de "Pedro responde" y te mostrar un pequeño cuadro marron como la imagen de abajo
Para activar el truco, debes comenzar escribiendo un "." (punto), pero en vez de mostrarte un punto, te mostrar la "P", despues escribes la respuesta y para terminar otro "." (punto), el resto del texto que escribas ya no importa, pero claro para que el truco tenga el mismo impacto, debes completar el resto de la peticion.

Despues escribes una pregunta, la pregunta no interesa, de todas formas te devolvera la respuesta que escribiste antes, y presiona OK para ver el resultado

Esto es lo que haremos hoy
El proyecto en Java
1. Crea un nuevo proyecto en Netbeans con los siguientes objetos y sus respectivos nombres
Ahora creamos otra clase "tarotvirtual.java", esta clase sera nuestra alma en pena que contiene el truco asi como unas cuantas respuestas alternativas.

import java.util.StringTokenizer;
import javax.swing.JTextField;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class tarotvirtual {
    //Array  que contiene la peticion que ve el usuario
    //el tamaño maximo de una respuesta es "textofake.length-2"
    // la respuesra oculta, de be ir entre dos "." osea ".RESPUESTA."
private String textofake[] = {"M","o","u","s","e"," ",
    "p","o","r"," ","f","a","v","o","r"," ","r","e","s","p","o","n","d","e"," ",
    "e","s","t","a"," ","p","r","e","g","u","n","t","a"};
//para almacenar el texto oculto
 private String texto = "";  
 //permite saber si se esta utilizando el truco
 private boolean truco = false;
 //su nombre lo dice todo
 private String RespuestasAlternas[] = {
 "Tu ansiedad por probarme te hace escribir cualquier cosa, así nunca te responderé.",
 "La pregunta que has realizado no es válida.",
 "Por el momento no responderé.",
 "Sigue intentando.",
 "El tiempo todo lo responde."};
 
    
    public tarotvirtual(){
    }  
    
    public void keypress(java.awt.event.KeyEvent evt, JTextField jt){
        //si se presiona tecla de borrado Backspace
         if(evt.getKeyCode()==8){
            System.out.println("borrando");
            //borra un caracter a la vez
            if(texto.length()>0){
                texto = texto.substring(0, texto.length()-1); 
            }            
         }
         else{
        //si el primer caracter es "." se activa el truco
            if((jt.getText().substring(0, 1).equals(".")) || (truco)){
                truco=true;
                //concatena el ultimo CHAR presionado
                texto = texto + evt.getKeyChar();
                System.out.println("texto oculto: " + texto);
                //reemplaza el texto introducido por otro 
                jt.setText(reemplazar(texto));
            }
            else{
                System.out.println("no se activo el truco");
            }
        }        
    }       
    
    /* reemplaza el texto introducido por teclado por otro*/
    private String reemplazar(String t){
       String tmp="";
       //el usuario puede seguir escribiendo, pero este texto ya no se mostrara
       if(t.length()>textofake.length){
            tmp = "Mouse por favor responde esta pregunta";
       }
       else{//reemplaza caracter por caracter
            for (int x=0;x<=t.length()-1;x++){
                tmp = tmp + textofake[x];
            }
       }
       return tmp;
    }
    
    /* Cuando se solicita la respuesta, se devuelve el texto que se en
        encuentra entre ".TEXTO." dos puntos mediante StringTokenizer */
    public void responde(JTextField jt,String peticion, String pregunta){
        if((peticion.equals("Mouse por favor responde")) ||(truco)){
            if(pregunta.equals("")){
                jt.setText("Te equivocaste, debes escribir una pregunta");
            }
            else{
                if(truco){
                StringTokenizer tokens=new StringTokenizer(texto, ".");
                jt.setText("" + tokens.nextToken());
                }
                else{
                    int num = (int)(Math.random()*(5));
                    jt.setText(RespuestasAlternas[num]);
                }
            } 
        }
        else{     
            jt.setText("La peticion no es validad");
        }
    }
    
    ///limpia objetos 
    public void nuevapregunta(JTextField jt1,JTextField jt2,JTextField jt3){
        jt1.setText("");//peticion
        jt2.setText("");//pregunta
        jt3.setText("");//respuesta
        texto = "";
        truco = false;
    }
}


Explicacion:
Esta clase "tarotvirtual.java" esta compuesto por los metodos:
keypress(java.awt.event.KeyEvent evt, JTextField jt): Este metodo tiene como parametros de entrada un evt "Evento de teclado" y un objeto JTextField que corresponde al control de "peticion", cuando el usuario comienza el "jt" con un PUNTO, se activa el truco y  a medida que se va escribiendo, el programa va ocultando el texto y reemplazandola por la peticion almacenada en textofake[], gracias al metodo privado reemplazar(String t). Si no se comienza con un PUNTO, entonces no se activa el truco.

responde(JTextField jt,String peticion, String pregunta): Este metodo tiene como entrada un JTextField que corresponde al control "respuesta", un String con la peticion "fake" y por ultimo un String con la pregunta, estos dos ultimos valores, solo sirven para determinar si existe algun error (mala escritura, no se escribio nada en la pregunta) o si el truco esta activado. De estar todo correcto, se utiliza StringTokenizer para extraer la respuesta oculta del estring "texto".

La implementacion en la Interfaz no puede ser mas facil:

Claro esta que esta aplicacion no contiene IA sino unas cuantas respuestas aleatorias, pero puede ser implementada mediante un "analizador sintactico" y demas cosa.


Y para que compares tus resultados aqui tienes el codigo fuente
Click para descargar

continue reading

24/3/10

Slide de videos de youtube en java

JAN29


Simple slide para cargar "vistas previas" de videos de youtube desde java y ejecutarlos despues en el navegador establecido en el sistema

Proyecto:
1. Se creo un JFrame en netbeans con la siguiente distribucion de objetos, esta clase interfaz se llama "jbanner.java"

2. Se creo una clase "slider.java"

import java.awt.Desktop;
import java.net.URI;
import java.awt.Desktop;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JLabel;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class slider {
    private int lenvid;// cantidad de videos
    //para almacenar las imagenes en memoria
    private BufferedImage[] _image;
    // para los ID de los videos de youtube
    private String ID[];    
    private URL _url;     
    //para las imagenes del slider
    int _imagen1=1;
    int _imagen2=2;
    int _imagen3=3;
    int _imagen4=4;
       
    /* el constructor de la clase con los ID de los videos*/   
    public slider(String id[]){        
        this.ID = id;        
        lenvid=ID.length;
    }
    
    /* carga las imagenes de youtube en memoria */
    public void cargar_imagen(){
        _image = new BufferedImage[lenvid];  
        //se llena el buffer con la imagen
        for(int i=0; i<=lenvid-1;i++){
            try {       
                _url = new URL("http://i2.ytimg.com/vi/" + ID[i]+ "/default.jpg");
                _image[i] = ImageIO.read(_url);
            } catch (IOException ex) {
                Logger.getLogger(slider.class.getName()).log(Level.SEVERE, null, ex);
            }
        }    
    }      
   
  public BufferedImage getImage(int n){
        return _image[n];
   }
  
  /* Abre el video en el navegador web del sistema */
public void abrirURL(int i){
        try {            
            Desktop.getDesktop().browse(new URI("http://www.youtube.com/watch?v=" + ID[i]));
        } catch (IOException ex) {
            Logger.getLogger(slider.class.getName()).log(Level.SEVERE, null, ex);
        } catch (URISyntaxException ex) {
            Logger.getLogger(slider.class.getName()).log(Level.SEVERE, null, ex);
        }
 }
 
/* Coloca las imagenes en miniatura de los videos de youtube en los objetos JLabel */
 public void setImagen(JLabel j1,JLabel j2,JLabel j3,JLabel j4){      
    j1.setIcon(new javax.swing.ImageIcon(getImage(_imagen1)));
    j1.repaint();
    j2.setIcon(new javax.swing.ImageIcon(getImage(_imagen2)));
    j2.repaint();
    j3.setIcon(new javax.swing.ImageIcon(getImage(_imagen3)));
    j3.repaint();
    j4.setIcon(new javax.swing.ImageIcon(getImage(_imagen4)));
    j4.repaint();    
 }
 
 /* avanza en 1 el slider y actualiza las imagenes */
 public void  Next(JLabel j1,JLabel j2,JLabel j3,JLabel j4){
     if (_imagen1==lenvid-1){_imagen1=1;}
     else {_imagen1++;}
     if (_imagen2==lenvid-1){_imagen2=1;}
     else {_imagen2++;}
     if (_imagen3==lenvid-1){_imagen3=1;}
     else {_imagen3++;}
     if (_imagen4==lenvid-1){_imagen4=1;}
     else {_imagen4++;}      
     setImagen(j1,j2,j3,j4);      
 }
 
 /* retrocede en 1 el slider y actualiza las imagenes */
 public void  Prev(JLabel j1,JLabel j2,JLabel j3,JLabel j4){
     if (_imagen1==1){_imagen1=lenvid-1;}
     else {_imagen1--;}
     if (_imagen2==1){_imagen2=lenvid-1;}
     else {_imagen2--;}
     if (_imagen3==1){_imagen3=lenvid-1;}
     else {_imagen3--;}
     if (_imagen4==1){_imagen4=lenvid-1;}
     else {_imagen4--;}
     setImagen(j1,j2,j3,j4);     
 }
}

La clase "slide.java", esta compuesta por el constructor slide(String id[]), que recibe un Array de String que contiene los ID de los videos de youtube
ej:
URL: http://www.youtube.com/watch?v=L2dO4DzgjsA
ID: L2dO4DzgjsA

Tambien se tiene el metodo cargar_imagen(), como su nombre lo indica, carga en el Buffer las imagenes que se obtienen de youtube, mediante la llamada url de:

http://i2.ytimg.com/vi/" + ID + "/default.jpg

Almacena estas en memoria que es un Array del tipo  BufferedImage.

El metodo getImage(int n), retorna una imagen de memoria, especificado su posicion en el array con el parametro "n".

El metodo setImagen(JLabel j1,JLabel j2,JLabel j3,JLabel j4), coloca las imagenes en los controles JLabel que son pasados como parametros, estos JLabel son 4.

Los metodos Next() y Prev(), no hacen otra cosa que avanzar o retroceder en uno el SLIDE y actualizar las imagenes en los controles JLabel.

Por ultimo el metodo abrirURL(int i), abre una direcion web de youtube especificado por el parametro "i"


Desktop.getDesktop().browse(new URI("http://www.youtube.com/watch?v=" + ID[i]));

La implementacion en la interfaz "jbanner.java"


slider mislider;
String id[] = new String[3];

public jbanner() {
        initComponents()
        //se declaran los ID de los videos de youtube
        id[0]="cc6nGy3SM4c";    
        id[1]="L2dO4DzgjsA";
        id[2]="fUYBC_YXxWQ";
        mislider = new slider(id);
        mislider.cargar_imagen();
        mislider.setImagen(jvideo1, jvideo2, jvideo3, jvideo4)
}
//evento para avanzar una posicion en el slide
private void lbNextMouseClicked(java.awt.event.MouseEvent evt) {
       mislider.Next(jvideo1, jvideo2, jvideo3, jvideo4);
}   
//evento para abrir una URL desde java
private void jvideo3MouseClicked(java.awt.event.MouseEvent evt) {
        mislider.abrirURL(mislider._imagen3)
}   

creo que el codigo se entiende, es bastante obvio y por demas comentado

El codigo fuente en Netbeans 6.0 puedes descargarlo desde aqui.

continue reading

17/3/10

Uso de objetos en varios JFrame's

JAN29

 Cuando creamos una aplicacion en java y queremos utilizar los objetos en mas de un JFrame o JInternalFrame, debemos declarar el objeto como STATIC, una ves hecho esto el objeto podra ser llamado desde cualquier otro formulario. vamos al ejemplo

Se crea una pequeña clase "persona.java", esta clase tiene dos metodos, setDatos() para la introduccion de informacion y getDatos() para la recuperacion de informacion.


/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class persona {
private String Nombre;
private String apPaterno;
private String apMaterno;
private String mail;
private int edad;
private String Celular;

    public persona(){
    }
    
    public void setDatos(String n, String p, String m, String ml, int e, String c){
        this.Nombre=n;
        this.apPaterno=p;
        this.apMaterno=m;
        this.mail=ml;
        this.edad=e;
        this.Celular=c;
    }
    
    public String[] getDatos(){
    String data[] = new String[6];
        data[0]=this.Nombre;
        data[1]= this.apPaterno;
        data[2]= this.apMaterno;
        data[3]=this.mail;
        data[4]= String.valueOf(this.edad);
        data[5]= this.Celular;
        return data;
    }
}

Lo que haremos sera declarar la clase "persona.java" en un JFrame, introducir datos y despues en un segundo JFrame, recuperar esos datos y mostrarlos en pantalla.

El Proyecto:

1.- Crea un JFrame: forma1 para la introduccion de datos, el JFrame debe tener la siguiente distribucion de objetos
 2. Crea otro JFrame: forma2, esta servira para la recuperacion de informacion
3. Declara en el JFrame: forma1, el objeto persona.java y el objeto forma2

static persona p = new persona();   
forma2 f2;

4. En el JButton de la forma1, inserta el siguiente codigo


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // vista previa
        String ml = txt4.getText() + "@" + jcmail.getSelectedItem().toString();
        int e = Integer.valueOf(txt5.getSelectedItem().toString());
        p.setDatos(txt1.getText(), txt2.getText(), txt3.getText(), ml, e ,txt6.getText());
        f2 =  new forma2();
        f2.show();
    }
Este codigo reune la informacion de los controles y las inserta en el objeto con el metodo SetDatos(), despues crea una instancia del objeto forma2 y muestra el formulario

5. en el JFrame: forma2, en el metodo formWindowOpened, se coloca el siguiente codigo:


private void formWindowOpened(java.awt.event.WindowEvent evt) {
        String datos[] = forma1.p.getDatos();
        lb1.setText(datos[0]);
        lb2.setText(datos[1]);
        lb3.setText(datos[2]);
        lb4.setText(datos[3]);
        lb5.setText(datos[4]);
        lb6.setText(datos[5]);         
        
    }
Como se puede ver, se puede utilizar el objeto persona: p, declarado en el JFrame: forma1

y tenemos

el codigo en netbeans esta aqui abajo

Click para descargar

continue reading

13/3/10

Base de Datos PRESTAMOS (proyecto completo)

JAN29


Ahora aqui dejo para su analisis un mini proyecto sobre una base de datos "PRESTAMOS" que consiste en llevar un control de los equipos prestados en una empresa constructora.

El modelo de datos Semantico es el siguiente:
y su equivalente en MER (Modelo Entidad Relacion)

La aplicacion para su conexion a la base de datos MYSQL, hace uso de la clase "conectate.java" y de la libreria  mysql-connector-java-5.0.7-bin, ademas para el control de la interfaz con la base de datos, se crea la clase "sqlclass.java" que consiste en varios metodos para INSERTAR, ELIMINAR, ACTUALIZAR registros de la base de datos.

Esta clase es utilizada por la interfaz para manipular los registros de  cada una de las tablas, como se ve en la imagen de arriba para la tabla Herramientas, donde se insertan los datos obtenidos de la base de datos en un objeto JTable, asi mismo esta clase tiene los metodos InsertarRegistro, DeleteRegistro, UpdateRegistro, que se implementan en la interfaz mediante una llamada:

String datos[] = {CodHer,descripcion,tipo,precio};
herramienta.InsertarRegistro(datos, "insert into herramienta values(?,?,?,?)");

donde el parametro datos es un objeto de tipa array que contiene la informacion a insertar en la base de datos y el parametro sql, que contiene la instruccion en sql para realizar la accion.
Igualmente para el metodo UpdateRegistro, se pasan los parametros datos(array de datos) y la instruccion sql

herramienta.UpdateRegistro(datos, "update Herramienta set descripcion=?, tipo=?, precio=? where CodHer=?");

finalmente la sintaxis para el uso del metodo eliminarRegistro, es:


herramienta.DeleteRegistro("herramienta", "CodHer", codigo);

donde se pasa como parametros, el nombre de la tabla en la cual se eliminaran registros, el nombre de la columna que contiene la llave primaria y el codigo (ID) de la fila del registro a eliminar

La clase "sqlclass.java" en su totalidad:

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class sqlclass {
  conectate con;
  
  public sqlclass (){
    con = new conectate();
  } 
  
  /* INSERTRA UN NUEVO REGISTRO EN LA BASE DE DATOS
   * PARAMETROS(Un array de String con los datos a insertar,la instruccion sql)*/
  public void InsertarRegistro(String datos[], String sql){
       try {          
            PreparedStatement pstm = con.getConnection().prepareStatement(sql);
            for(int i=0; i<=datos.length-1;i++){
             
            }  
            pstm.execute();
            pstm.close();
         }catch(SQLException e){
         System.out.println(e);
      }
   }
     
  /* BORRA UN REGISTRO DE LA BASE DE DATOS
   * parametros (Nombre de la tabla, nombre columna, Codigo unico)*/
  public void DeleteRegistro(String tabla, String col, String id){  
            try {                
                PreparedStatement pstm = con.getConnection().prepareStatement("delete from " + tabla + " where " + col + " = ?");
                pstm.setString(1, id);
                pstm.execute();
                pstm.close();
            }catch(SQLException e){
            System.out.println(e);
            }            
   }
  
  /* ACTUALIZA UNA TABLA DE LA BASE DE DATOS
   * parametros (Un Array de string con los datos a actualizar, la instruccion sql )*/
    public void UpdateRegistro(String datos[], String sql){
       try {
            PreparedStatement pstm = con.getConnection().prepareStatement(sql);
            for(int i=0; i<=datos.length-1;i++){
                pstm.setString(i+1, datos[i]);
            }       
            pstm.execute();
            pstm.close();   
         }catch(SQLException e){
         System.out.println(e);
      }
   }
    
   /*  METODO PARA OBTENER TODOS LOS DATOS DE UNA TABLA
    *  parametros (Un array con los nombres de las columnas, el nombre de la tabla, la instruccion sql) */
 public Object [][] GetTabla(String colName[], String tabla, String sql){
      int registros = 0;
      //obtenemos la cantidad de registros existentes en la tabla
      try{         
         PreparedStatement pstm = con.getConnection().prepareStatement("SELECT count(1) as total FROM " + tabla);
         ResultSet res = pstm.executeQuery();
         res.next();
         registros = res.getInt("total");
         res.close();
      }catch(SQLException e){
         System.out.println(e);
      }
      
    Object[][] data = new String[registros][colName.length];  
    String col[] = new String[colName.length];
    
    //realizamos la consulta sql y llenamos los datos en "Object"
      try{         
         PreparedStatement pstm = con.getConnection().prepareStatement(sql);
         ResultSet res = pstm.executeQuery();
         int i = 0;
         while(res.next()){            
            for(int j=0; j<=colName.length-1;j++){
                col[j] = res.getString(colName[j]);
                data[i][j] = col[j];
            }          
            i++;
         }
         res.close();
          }catch(SQLException e){
         System.out.println(e);
    }
    return data;
 }  
 
/* METODO PARA TODOS LOS DATOS DE UNA COLUMNA
 * parametros (Nombre de la tabla, nombre columna, instruccion sql ) */
public Object [] GetColumna(String tabla, String colName, String sql){
      int registros = 0;
      //obtenemos la cantidad de registros existentes en la tabla
      try{         
         PreparedStatement pstm = con.getConnection().prepareStatement("SELECT count(1) as total FROM " + tabla);
         ResultSet res = pstm.executeQuery();
         res.next();
         registros = res.getInt("total");
         res.close();
      }catch(SQLException e){
         System.out.println(e);
      }
      
    Object[] data = new String[registros];    
      try{         
         PreparedStatement pstm = con.getConnection().prepareStatement(sql);
         ResultSet res = pstm.executeQuery();
         int i = 0;
         while(res.next()){            
            data[i] = res.getString(colName);
            i++;
         }
         res.close();
          }catch(SQLException e){
         System.out.println(e);
    }
    return data;
 }  

/* METODO PARA OBTENER UN DATO DE UNA TABLA
    PARAMETROS (nombre columna, instruccion sql) */
public String GetData(String colName, String sql){
    String data = new String();    
      try{         
         PreparedStatement pstm = con.getConnection().prepareStatement(sql);
         ResultSet res = pstm.executeQuery();         
         while(res.next()){            
            data = res.getString(colName);
         }
         res.close();
          }catch(SQLException e){
         System.out.println(e);
    }
    return data;
 }  

} //fin clase

la clase contiene ademas el metodo getTabla(), que obtiene todos los datos de una tabla de la base de datos y los coloca en un objeto Object[][] para utilizarlo mas facilmente en la interfaz, por ejemplo:


private void updateTabla(){
   String[] columNames = {"Codigo","Descripcion","Tipo","Precio"};
   String colName[] = {"CodHer","descripcion","tipo","precio"};
   //nombre de columnas, tabla, instruccion sql
   dtHer = herramienta.GetTabla(colName, "herramienta", "select * from herramienta order by CodHer");
   // se colocan los datos en la tabla
   DefaultTableModel datos = new DefaultTableModel(dtHer,columNames);
   tabla.setModel(datos);
}
Se crea un array colName[] y se lo llena con los nombres de las columnas de la BD, y se lo pasa como parametro al metodo GetTabla, al que ademas se especifica, el "nombre de la Tabla" y la instruccion SQL para realizar la obtencion de datos.


El proyecto tambien hace uso del tipo de formularios MDI (multiple document interface) y de la libreria Substance para aplicar un skin a la interfaz


Vista general del proyecto
[Enlace de descarga actualizado 27-03-2011]
El proyecto para descargar
Click para descargar

continue reading

8/3/10

[Respuesta] Redimensionar el video en JMF

JAN29


Dando respuesta a una duda sobre un post anterior que trata sobre la  "Reproduccion de un video en Java con Java MediaFramework", donde se me hace la pregunta sobre un problema al tratar de redimensionar el JFrame, el video se pierde o se distorsiona. Muy buena pregunta y aqui mi solucion.

El error que  muestra el reproductor de video, mas que error de programacion es un olvido de mi parte,ya que me enfoque en la reproduccion de un video y no , el error  se produce cuando se intenta redimensionar el JFrame, el video se distorsiona y cambia de posicion como se ve en la imagen de abajo. Y tambien en otras pruebas que realice al tratar  de redimensionar el JPanel, todos los controles se distorsionaron completamente.
¿Porque se produce esto? 
Cuando se utilizan IDE's como Netbeans que nos ayudan en la creacion de aplicaciones, el programador muchas veces da por hecho algunos aspectos como la alineacion, tamaño, posicion de los objetos en la interfaz y se deja estos con su valor en "default", muchas veces esto no nos causa mayor problema, pero en esta ocasion se puede observar de que si es importante una perfecta distribucion de los objetos en la interfaz.

La Solucion
La solucion que encontre consiste en darle a los componentes un tamaño y posicion 
this.setSize(500, 500);//JFrame
Super.setSize(480, 480);
pantalla.setSize(460, 360);
control.setSize(460,50);  
Logicamente estos valores solo son de referencia para este proyecto, ahora la interfaz estara compuesta de :

Se añadio un nuevo JPanel, llamado Super, este servira de contenedor para los demas JPanels, la nueva interfaz tiene la siguiente distribucion en la vista diseño:
Todo esto respecto al diseño, ahora en el codigo, los cambios realizados en el codigo de la clase "videopanel.java", la que es encargada de crear el Player, es la creacion de un nuevo metodo:

 public void UpdateSize(Dimension d){
        video2.setSize(d);
        video2.setLocation(0,0);
        controls.setSize(d.width, 50);
}

Esta nuevo metodo, es el encargado de dimensionar el Player del JMF, tambien de darle una posicion respecto a su contenedor (JPanel), lo mismo se realiza con el Component "control". No hay mayores cambios en esta clase.

En la interfaz se debe crear un metodo que redimensione todos los JPanel, incluidos demas controles como Button, Label, Textbox, etc. y despues llamar al metodo creado mas arriba "UpdateSize()" y pasarle las nuevas dimensiones del JPanel: Pantalla.


El resultado

Como siempre el codigo fuente de ayuda con los cambios en el reproductor en el siguiente enlace:
http://link.jc-mouse.net/?id=9UMP41UMP4

Espero haber explicado bien lo que trate de hacer, sino, pues las preguntas son bienvenidas

continue reading

7/3/10

Agujero de seguridad en navegadores y java

JAN29

Java controla la creacion de ventanas desde los applet para evitar engañar al usuario, pero estas restriciones pueden ser esquivadas con algunas trampas y asi crear ventanas desde los applet simulando ser aplicaciones propias del sistema operativo, engañar al suario y llevar a cabo acciones "maliciosas" o simplemente causarles un gran susto :)

En este ejemplo, se simula mediante la creacion de un objeto "window", la clasica "pantalla azul de la muerte" del sistema operativo windows, que bien podria engañar a un "usuario promedio" que navega por internet, este metodo, tambien podria usarse por ejemplo para engañar al usuario para "obtener contraseñas", "obtener datos del usuario", "meterle algun malware", etc, aprovechando la ingenuidad de la mayoria de las personas que navega por internet (ingenieria social). pero es solo un ejemplo, no lo hagan :) estan avisados ;)

Pantalla azul de la muerte desde java

Para crear esta pantalla, se crea primeramente una ventana sin bordes utilizando la clase Window de java, se añade los objetos necesarios, el tamaño que debe tomar este applet debe ser del tamaño de toda la pantalla, asi se oculta un pequeño mensaje que crea java para avisar de que esta ventana proviene de un applet
El codigo para el WINDOW:

import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.Window;
import javax.swing.JLabel;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class MyWindow  extends Window{
    public MyWindow(Frame padre){
        //Se invoca un constructor de la clase padre
        super(padre);
        //se da un tamaño a la nueva ventana sin bordes "window"
        this.setSize(300,200);
        // se otorga la posicon respecto a la pantalla
        this.setLocation(400,200);
        // ahora se añaden algunos objetos
        Panel p = new Panel();
        p.setBackground(new Color(0,0,255));
        JLabel lb = new JLabel("<html>Hola Mundo<br>Esta es una ventana sin bordes<br>desde un applet</html>");
        lb.setForeground(new Color(0,255,0));
        p.add(lb);
        // ahora estos objetos se añaden al objeto window
        add("Center",p);
    }
}

Para llamar a esta clase desde un applet:


Frame miFrame = new Frame();
MyWindow m = new MyWindow(miFrame);
m.show(); 

El video para una mejor comprension de lo que se intenta lograr

Y no podia faltar el codigo fuente.
Click para descargar

continue reading

5/3/10

Imagen de fondo en una aplicacion MDI en Java

JAN29

En un post anterior se explico la creacion de una sencilla aplicación MDI en java desde Netbeans, ahora tratando de dar un poco de personalizacion a la aplicacion, en este post se explica el codigo necesario para la incorporación de una imagen de fondo en un formulario MDI en java.

Se crea una nueva clase que implementa la clase abstracta "Border", en el constructor de la nueva clase "ImagenFondo.java" se declara la imagen que se utilizara como fondo, esta imagen se encuentra en el mismo paquete que el resto de las clases, se carga esta imagen en momoria haciendo uso de la clase BufferedImage, despues se sobreescriben todas funciones propias de la clase Border, y en el metodo paintBorder() se dibuja la imagen con drawimage.

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.border.Border;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class ImagenFondo implements Border {    
    BufferedImage fondo;
    public ImagenFondo(){    
        try {       
            //se obtiene la imagen            
            URL url = new URL(getClass().getResource("/mdijava/picmouse.jpg").toString());
            fondo = ImageIO.read(url);    
            
        } catch (IOException ex) {
            Logger.getLogger(ImagenFondo.class.getName()).log(Level.SEVERE, null, ex);
        }      
    }
    // se sobreescriben metodos propios de Border
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height){     
        //se dibuja la imagen de fondo en el centro del contenedor
        //cada que se redimensione el contenedor, la imagen automaticamente se posiciona en el centro
        g.drawImage(fondo, (x + (width - fondo.getWidth())/2),(y + (height - fondo.getHeight())/2), null);
    }

    public Insets getBorderInsets(Component c){
    return new Insets(0,0,0,0);
    }

    public boolean isBorderOpaque(){
    return true;
    }
}


La implementacion de esta clase en la aplicacion en Netbeans se realiza de la siguiente manera:

public papa() {        
      initComponents(); 
      jDesktopPane1.setBorder(new ImagenFondo());
}

Donde papa(), es el nombre del constructor de la clase JFrame que hace de formulario padre para los demas JInternalFrame (Formularios hijos), JDesktopPane es el contenedor para los formularios hijos, y es ahi donde se implementa la clase "imagenFondo,java", añadiendole  a su propiedad "Border" la nueva clase creada.

El codigo de ejemplo en el siguiente enlace

Click para descargar

continue reading

3/3/10

Un sencillo "diario" con el Bloc de Notas de Windows

JAN29


El Bloc de notas de Microsoft Notepad es una herramienta de proceso de textos que se incluye con Windows y se instala de manera predeterminada debajo del grupo de programas Accesorios. La puede utilizar para crear un archivo de tipo registro que agregue la fecha y la hora actuales cada vez que se abra el archivo del Bloc de notas. Este artículo describe cómo abrir un archivo de registro con el Bloc de notas. 

Pasos:
1. Cree un archivo de texto y dele un nombre cualquiera.
2. En el archivo creado escriba .LOG al inicio del documento y guardelo
Ahora cada ves que abra el archvio de texto, se añadira automaticamenta la hora y fecha del sistema
fuente: http://support.microsoft.com/kb/260563

continue reading

2/3/10

Ingenieria de Software (Proceso Básico)

JAN29

Ingeniería de software es la disciplina o área de la informática que ofrece métodos y técnicas para desarrollar y mantener software de calidad.

Productos de CALIDAD a un MONTO ECONOMICO en el TIEMPO OPORTUNO




Ingenieria de Software (Proceso Básico)
Se debe tomar en cuenta:
Disciplina: Se refiere a respetar "normas de desarrollo" (Métodos), esto nos permite que el proyecto sea "entendible" por cualquier otra persona (ingeniero de software) que necesite darle "mantenimiento" en cualquier momento
Sistemático: Dividir el proyecto en partes mas pequeñas de manejar de acuerdo a un metodo de desarrollo (Ciclo de Vida)
Medición: Quiere decir, tomarse el trabajo para realizar un control sobre el "tiempo de desarrollo", "calidad del software", etc.

Variables a Considerar:
Costo: Tratar de no sobrepasar el dinero que se tenga presupuestado, si es un proyecto independiente, conseguir nuevos auspiciadores retarda el proceso de desarrollo y si es un proyecto a pedido, gastar más dinero del asignado por el cliente, causa molestias en estos y aleja a nuevos clientes.
Tiempo: Controlar el tiempo desarrollo, la mayoria de los clientes quiere resultados inmediatos, pero esto no debe poner en riesgo la calidad del software
Capacidad: Se refiere a las exigencias impuestas por el cliente (Un procesador de texto, una Web Comercial, Gestion de Base de Datos, etc), se debe tratar de cumplir con todos estas exigencias con la menor cantidad de errores en el menor tiempo posible.
Calidad: La calidad de un sofware, se mide primeramente de acuerdo a "su desarrollo" y luego en su "uso" por parte del cliente final.

continue reading

Post recomendado