En esta ocasión voy a tocar un tema que desde mi punto de vista es muy interesante, se trata de cómo abrir archivos de cualquier tipo desde Java. Si tienes algo de experiencia en el tema, sabrás que existe una manera de hacerlo ejecutando un
comando de consola desde Java, o incluso con el comando
Runtime.getRuntime().exec(rutaArchivo), sin embargo, a partir de Java 6 tenemos la clase java.awt.Desktop que nos permite interactuar con las aplicaciones preferidas del sistema operativo. Lo que podemos realizar al utilizar esta clase es lo siguiente:
- Abrir una dirección web en el navegador web por defecto.
- Abrir el cliente de correo por defecto con datos específicos de un correo saliente como el destinatario, mensaje, cc, etc.
- Abrir, editar o imprimir algún archivo por medio de su aplicación configurada para dicha acción por defecto.
Se me ocurre por ejemplo que después de que el cliente corra la aplicación que desarrollamos por primera vez le mande a nuestro sitio en internet, o incluso colocar la ayuda de la misma en un servidor web, etc.
Debemos tomar en cuenta que en ocasiones tenemos una aplicación configurada para abrir los archivos y alguna otra para editarlos, por ejemplo, puede ser que las imágenes las veamos en Picasa y las editemos con Photoshop o algo por el estilo.
Teniendo claro la función de la clase java.awt.Desktop pasemos a un ejemplo de su utilización.
Aplicación EjemploClaseDesktop.jar creado en NetBeans 6.1
En primera instancia creé un nuevo proyecto con el nombre EjemploClaseDesktop.jar y agregué un nuevo JFrame, posteriormente agregué paneles, campos de texto, botones y radio botones de manera que quedara de la siguiente manera:
Una vez creado el JFrame, agregué las siguientes variables globales:
Desktop d; //Para realizar los procedimientos
File archivo; //Para almacenar el archivo a abrir, editar o imprimir
y al constructor se le agregó el siguiente código...
/*Establece el título de la ventana*/
setTitle("Ejemplo java.awt.Desktop");
/*Posiciona la ventana en el centro de la pantalla*/
setLocationRelativeTo(null);
setVisible(true);
/*Obtiene una instancia del escritorio*/
d = Desktop.getDesktop();
/*Verifica que el ambiente del SO soporte los procedimientos*/
if(d.isDesktopSupported()){
/*si es así habilita los campos*/
habilitarCampos(true);
}else{
/*de lo contrario muestra un error e inhabilita los campos*/
JOptionPane.showMessageDialog(this, "El sistema no soporta los procedimientos.", "Error", JOptionPane.ERROR_MESSAGE);
habilitarCampos(false);
}
En el código anterior se puede notar que antes de realizar cualquier procedimiento es recomendable verificar si el ambiente actual soporta los procedimientos a realizar (esto a través del método isDesktopSupported()), de ser así se habilitan los campos contenidos en la ventana.
Navegación web::
Una vez hecho lo anterior agregamos el evento al botón Ir del panel Web y escribimos el siguiente código:
/*si no se ha escrito nada en el campo de texto*/
if(txweb.getText().equals("")){
JOptionPane.showMessageDialog(this, "No has escrito una dirección", "Error", JOptionPane.ERROR_MESSAGE);
txweb.requestFocusInWindow();
return;
}
try {
d.browse(new URI(txweb.getText()));
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, "Error al verificar la dirección.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
El método
browse(URI) nos permite abrir el navegador web por defecto en el sistema operativo en la dirección indicada por un objeto
URI, en este ejemplo es la dirección que se escribe en el campo de texto correspondiente.
Correo electrónico::
Para abrir el cliente de correo por defecto en el sistema con la dirección del destinatario indicada en el campo de texto se utiliza el siguiente código:
String mail = "mailto:"+txemailpara.getText();
try {
d.mail(new URI(mail));
} catch (Exception ex) {
Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
}
El método
mail(URI) nos permite abrir el cliente de correo por defecto con los datos indicados por el objeto URI, existen muchas maneras de estructurar una dirección URI para correo de manera que podamos pasar el asunto del correo, CC, mensaje y demás, para mayor información te recomiendo darte una vuelta por
este sitio.
Apertura, edición e impresión de archivos::
Ahora, para el manejo de archivos tenemos que agregar el evento tanto al botón de Examinar (para escoger el archivo) como al botón de Ok (para realizar la acción), el código del botón Examinar es el siguiente:
JFileChooser fc = new JFileChooser();
int resp = fc.showOpenDialog(this);
if(resp == JFileChooser.APPROVE_OPTION){
archivo = fc.getSelectedFile();
txarchivo.setText(archivo.getAbsolutePath());
}
En el código anterior se declara un nuevo objeto de la clase
JFileChooser que nos permita navegar por las carpetas y localizar el archivo sobre el cual realizaremos la acción indicada,
una vez que se selecciona el archivo se almacena en el objeto (de acceso global) tipo File de nombre archivo y se indica su ruta en el campo de texto correspondiente.
Al contar con un archivo sobre el cual trabajar podemos pasar al evento del botón Ok que realiza lo siguiente:
if(archivo!=null){
try{
if(rdAbrir.isSelected()){
d.open(archivo);
}
if(rdEditar.isSelected()){
d.edit(archivo);
}
if(rdImprimir.isSelected()){
d.print(archivo);
}
}catch(Exception ex){
JOptionPane.showMessageDialog(this, "Ocurrió un error al realizar la acción.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
}else{
JOptionPane.showMessageDialog(this, "No has seleccionado el archivo.", "Error", JOptionPane.ERROR_MESSAGE);
btnExaminar.requestFocusInWindow();
return;
}
En el código anterior se verifica qué radio botón está seleccionado y se realiza la acción indicada, cabe mencionar que los 3 radio botones pertenecen al mismo grupo (ButtongGroup), el método open() abre el archivo indicado en la aplicación por defecto para dicha acción, edit() abre la aplicación por defecto para editar el archivo y print() imprime el archivo, de igual manera, a través de la aplicación por defecto del sistema.
Esto es todo con respecto a la clase java.awt.Desktop, el proyecto completo de NetBeans puedes descargarlo
desde aquí.
¿Alguna duda o algo qué decir? Deja tu comentario. Saludox
Me parece un Excelente artículo, de suma utilidad, muchas gracias. Totalmente recomendable.
ResponderBorrarGracias por tu comentario Fernando. Saludox.
ResponderBorrarel link para descargarlo no funciona
ResponderBorrarte dejo mi correo es que tengo una duda sobre esto y necesito que me ayudes porqe estoy haciendo un proyecto gracias
ResponderBorraredwin7-91@hotmail.com
me podrias enviar el programa a mi correo lo necesito.. por favor!!
ResponderBorrartlaco_2390@hotmail.com
disculpa el link no funciona me podrias enviar el programa a mi correo por favor. me urge y gracias
ResponderBorrarsakuradarkness@hotmail.com
Me parece interesante tu articulo pero me podrias enviar el programa a mi correo por favor!!
ResponderBorrartonyocampoc@gmail.com
Por favor, necesito que vuelvas a colgar el enlace, estoy haciendo el PFC y me hace falta importar un vídeo. Muchas gracias!!!
ResponderBorrarhola men puedes mandarme el proyecto a mi correo ya no sirve desacargarlo porfavor mi correo es lito_s19@hotmail.com necesito estudiarlo para mi examen parcial de la universidad please
ResponderBorrarHola amigo, me puedes enviar el proyecto a mi correo:
ResponderBorrarLocoxti_15_15_15@hotmail.com
Oye amigo me puedes mandar a mi correo hectoranq@gmail.com
ResponderBorrarEs posible determinar luego de abrir un browser si este fue cerrado usando Desktop?
ResponderBorrarEs decir:
java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
desktop.browse(java.net.URI.create(this.url));
Luego quiero que mi aplicación java reaccione cuando se cierra el browser.
Muchas gracias,
camarada mi correo es anyelius_j-r@hotmail.com pasa el codigo se te agradeceria mucho
ResponderBorrarYa logre replicar el ejemplo.
ResponderBorrarSolo tengo un detalle. Las variables globales a las que haces referencia:
Desktop d;
File archivo;
En realidad no son globales, son locales a las clases respectivas donde se ocupan.
Sólo así pude ejecutar tu ejemplo.
De no ser así, te pediría indiques de que forma las pones para considerarlas globales.
Mi correo es rusell_villegas@hotmail.com
Agradecería tu comentario
me podrias enviar el programa a mi correo lo necesito.. por favor!!
ResponderBorraraghuszfersystems@hotmail.com
podrias mandame el archivo pofavor a mi correo:
ResponderBorrarstrikefreedom1625@yahoo.com
Hola buenas tardes, me harias el favor de enviarme el proyecto a mi correo por que no lo pude bajar desde el enlace mi correo: pmansilla@outlook.com desde ya muchas gracias. Saludos
ResponderBorrarHola me puedes enviar el archivo porfavor no funciona el link, mi correo es fabian.dragoonred@gmail.com
ResponderBorrarGracias soy novato y me parece bueno tu artículo,
ResponderBorrar