Recientemente trabajando con bases de datos relacionales, y crear reporter de consultas en diversos formatos como pdf, odf, xml, docx, xlsx, etc. con la ayuda del jasperreports, necesitaba de facilitar al usuario el abrir dichos documentos con la aplicacion predeterminada por el SO Windows.
Utilizando un poco de mis conocimientos en Win, decidi hacer una prueba y funcionó excelente para cualquier documento.
Solo deben crear la ruta al archivo
String ruta="W:\\MyEclipse\\Proyectos\\jsivet\\bin\\reports\\producto\\productos.docx";
Realmente ustedes deciden como crear la ruta, o si lo quieren con un JFileChooser.
Luego deberiamos hacer algo así:
try{
Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL "+url);
}
catch(RuntimeException rte){rte.printStackTrace();}
Si todo sale bien, se abre nuestro archivo con la aplicacion predeterminada, es decir Ms Word porque la extención del archivo es docx, si no se especifica la extensión, entonces nos solicita que seleccionemos la aplicación con la cual deseamos abrir nuestro documento.
jueves, 26 de enero de 2012
martes, 24 de enero de 2012
Imagen de fondo en un JDesktopPane
Si trabajamos con objetos JDesktopPane, talvez deseamos poner una imagen personalizada como fondo.
Como la que se ve en la siguiente imagen de muestra de mi aplicación JSivet.
Para lograr ese efecto, podemos crear una clase que herede a JDesktopPane como la siguiente:
public class Escritorio extends JDesktopPane{
private static Image IMG=new ImageIcon(getClass().getResource("img/logojsivet.png")).getImage();
public void paintChildren(Graphics g){
g.drawImage(IMG, 0, 0, getWidth(), getHeight(), this);
super.paintChildren(g);
}
}
He decidido crear un objeto Image de tipo statico privado, aunque se puede crear como un objeto de clase, este representará la imagen que deseamos dibujar como fondo.
Debemos sobreescribir el método paintChildren
Como la que se ve en la siguiente imagen de muestra de mi aplicación JSivet.
Para lograr ese efecto, podemos crear una clase que herede a JDesktopPane como la siguiente:
public class Escritorio extends JDesktopPane{
private static Image IMG=new ImageIcon(getClass().getResource("img/logojsivet.png")).getImage();
public void paintChildren(Graphics g){
g.drawImage(IMG, 0, 0, getWidth(), getHeight(), this);
super.paintChildren(g);
}
}
He decidido crear un objeto Image de tipo statico privado, aunque se puede crear como un objeto de clase, este representará la imagen que deseamos dibujar como fondo.
Debemos sobreescribir el método paintChildren
- Dibujamos la imagen sobre el componente que inicie en las coordenadas x=0, y=0 y se extienda por todo el ancho ("getWitdh()") y el alto ("getHeight()"),
- Invocamos al método paintChildren mediante la palabra reservada super, haciendo referencia al paintChlidren de su super clase la cual es JDesktopPane.
lunes, 23 de enero de 2012
ResultSet a TableModel
Cuando estamos trabajando bases de datos, es de gran utilidad mostrar los resultados de una consulta en un objeto JTable, los objetos ResultSet del paquete java.sql de la J2SE proporcionan una tabla de datos que representan un conjunto de resultados de bases de datos, que normalmente es generado por la ejecución de un comunicado a traves de sentencias SQL a la base de datos. Aunque un objeto ResultSet solo se mueve hacia adelante, por lo que solo se puede iterar sobre este solo una vez, desde la primer fila hasta la última a travez del método next(), resulta muy util.
Por lo que el siguiente fragmento de código proporciona una idea de como tratar a los objetos java que proporcionen tablas de datos.
public static TableModel resultSetToDefaultTableModel(ResultSet rs) throws SQLException{
ResultSetMetaData rsmd=rs.getMetaData();final int numCols=rsmd.getColumnCount();//El numero de columnas en la consulta
String[] columnas=new String[numCols];
Object[][] datos=new Object[0][0];//Esto representara los datos de la consulta o registros
//Aqui obtenemos los nombres de las columnas
for(int i=0;i<numCols;i++)
columnas[i]=rsmd.getColumnName(i+1);
rsmd=null;
//Iteramos por las filas del ResultSet
while(rs.next()){
//Creamos un array que representara cada registro con la misma longitud de columnas
Object[] registro=new Object[numCols];
//Copiamos los datos del registro
for(int i=0;i<numCols;i++){
registro[i]=rs.getObject(i+1);
}
//Aumentamos el tamaño de la matriz en 1
datos=Arrays.copyOf(datos, datos.length+1);
//Agregamos el nuevo registro al final, ("Una nueva fila")
datos[datos.length-1]=registro;
}
rs.close();
return new DefaultTableModel(datos,columnas);
}//Fin del método resultSetToDefaultTableModel
Me parece que los comentarios explican muy bien el código.
Ocultar columnas en un JTable
Si estamos trabajando con bases de datos y cargamos una consulta en un un objeto JTable, puede que necesitemos ocultar columnas en dicho objeto, especialment si existen columnas que hacen referencia a llaves primarias.
Una posible solución podría ser la siguiente:
public void ocultarColumnas(int... indiceColumnas){
//Evitamos un NullPointerException
if(indiceColumnas==null)
return;
for(int numColumna:indiceColumnas){
TableColumn col=getColumn(getColumnName(numColumna));
col.setWidth(0);
col.setMaxWidth(0);
col.setMinWidth(0);
col.setPreferredWidth(0);
col.setResizable(false);
}
doLayout();
}
Se puede utilizar asi:
Podemos pasarle un arreglo int con los indices de las columnas
tabla.ocultarColumnas(array);
o bien si queremos solo una columna:
tabla.ocultarColumnas(numColumnas);
o bien algunas de ellas sin crear el arreglo:
tabla.ocultarColumnas(numColumna1,numColumna2,numColumna3);
Una posible solución podría ser la siguiente:
public void ocultarColumnas(int... indiceColumnas){
//Evitamos un NullPointerException
if(indiceColumnas==null)
return;
for(int numColumna:indiceColumnas){
TableColumn col=getColumn(getColumnName(numColumna));
col.setWidth(0);
col.setMaxWidth(0);
col.setMinWidth(0);
col.setPreferredWidth(0);
col.setResizable(false);
}
doLayout();
}
Se puede utilizar asi:
Podemos pasarle un arreglo int con los indices de las columnas
tabla.ocultarColumnas(array);
o bien si queremos solo una columna:
tabla.ocultarColumnas(numColumnas);
o bien algunas de ellas sin crear el arreglo:
tabla.ocultarColumnas(numColumna1,numColumna2,numColumna3);
Componentes que no cambian de tamaño
Algunas veces cuando estamos trabajando formularios en tiempo de ejecución con una conexión a una base de datos y tenemos componentes por ejemplo del tipo JComboBox, y cuando seleccionamos una opcion en uno de ellos, lanzamos un ItemListener que consulta la base de datos y carga con nuevas opciones nuestros combobox, pero ademas estos varias la longitud de su tamaño, lo que suele ser algo incomodo para algunos.
La solución rápida puede ser la siguiente:
JComboBox cb=new JComboBox();
Dimension d=cb.getPreferredSize();
cb.setPreferredSize(d);
Con esto debe ser suficiente aunque opcionalmente pueden añadir algo como:
cb.setMazimumSize(d);
cb.setMinumumSize(d);
cb.setSize(d);
Suscribirse a:
Comentarios (Atom)
