Al establecer la orientación de un componente JCombobox de la siguiente manera:
JComboBox comboBox = new JComboBox();
comboBox.setComponentOrientation(ComponentOrientation.RIGTH_TO_LEFT);
Resulta que los el botón de despliegue del menú ahora se situa a su izquierda, pero la alineación de los items va a su derecha, por lo que a mi opinión personal resulta un tanto molesto, despues de tanto buscar y no encontrar nada en Internet he decidido hacerlo de la única forma que se me ocurrió, la cual es implementando un ListCellRenderer de la siguiente forma:
JComboBox comboBox = new JComboBox();
comboBox.setComponentOrientation(ComponentOrientation.RIGTH_TO_LEFT);
comboBox.setRenderer(new BasicComboBoxRenderer(){
public Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected,
boolean cellHasFocus) {
ComponentOrientation listCO = list.getComponentOrientation();
ComponentOrientation lTRCO = ComponentOrientation.LEFT_TO_RIGHT;
if(!listCO.equals(lTRCO))
list.setComponentOrientation(lTRCO);
return super.getListCellRendererComponent(list, value, index, isSelected,
cellHasFocus);
}
});
Claro que también se puede implementar como una clase interna o externa, no solamente como una clase anonima.
domingo, 21 de octubre de 2012
sábado, 5 de mayo de 2012
Reparar asociación de archivo .Jar (Windows)
A muchos alguna vez les pasó que por alguna razón al dar doble clic sobre un archivo .jar, este no responde o no se abre correctamente, además en muchasocaciones se muestra un ventana de comandos cmd por un instante y para poder ver lo que dice debemos tomar una instantanea. Todo esto es porque la asociacion con la máquina virtual de Java ha sido atribuida
a otro programa, algo que puede ocurrir con frecuencia en Windows.
Googleando un poco, logré encontrar una herramienta que permite reparar la asociación de archivos JAR, con un simplee doble clic, así no deberas volver a reinstalar java nuevamente en tu sistema Windows, ni modificar el registro de Windows. No necesita instalar ni nada por el estilo, solo doble clic y listo. Acá les dejo el link.
jueves, 26 de enero de 2012
Abrir archivos en Windows desde Java
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.
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.
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)
