jueves, 31 de mayo de 2012

Acceso a un Sistema. Parte I de II

Bueno, voy a intentar explicar cómo hacer un sistema de acceso sencillo a un programa, lo que normalmente conocemos en inglés como "login".


El esquema del programa es muy básico:












Supongo que esta entrada es muy básica, pero me lo ha pedido un compañero de forosdelweb y bueno, he decidido hacerlo, aunque no voy a incluir contraseñas cifradas ni nada por el estilo, todo muy básico puesto que esto va destinado a personas que se están iniciando.


La estructura del programa será este:










La clase principal contendrá únicamente la llamada a la ventana principal:











Ahora vamos con Ventana Principal. En esta ventana tendremos 2 etiquetas (JLabel)  y 2 Campos de Texto (JTextField). Si se pulsa sobre Aceptar, conectaremos con la Base de Datos, en mi caso Mysql.


Aquí el contenido de VentanaPrincipal.java







Para poder conectar con nuestra Base de Datos necesitamos el driver. Lo podemos encontrar aquí: http://dev.mysql.com/downloads/connector/j/


Luego una vez descargado lo ponemos en una carpeta lib en /src o bien lo linkamos, como nosotros queramos.


Ahora nos queda AccesoSistema.java, en donde vamos a presentar dos botones para Crear Usuario o para Listar Usuarios. Quedaría de la siguiente manera:







Así es cómo queda al ejecutarlo:




Ventana Principal






Ventana Sistema










Aquí termina la parte I, mañana posiblemente termine la segunda parte. No he explicado mucho pero cualquier duda que tengais podéis preguntarla.


Un saludo.

miércoles, 23 de mayo de 2012

Crear un Gráfico con Datos de una Base de Datos usando JFreeChart



Buenas tardes a todos. En esta entrada voy a explicar brevemente cómo poner un gráfico en vuestra aplicación Swing, aunque de igual manera se puede implementar para un applet o lo que se quiera.


La idea es montar un gráfico extrayendo datos desde una Base de Datos. El cómo conectarse a una BD no lo voy a explicar aunque si alguien necesitara que se lo explicase, solamente tiene que decirmelo.


Lo primero que tenemos que hacer es ir la web de JFreeChart en dónde tendremos que descargarnos el jar generado. Necesitaremos tanto el jar de JFreeChart como el de common, adjunto en el mismo.


Lo agregamos a nuestro proyecto (Build Path) con botón derecho, propiedades y en la pestaña Añadir Jar se lo agregamos (Estoy hablando para el IDE Eclipse).


Empezamos con el código:







El código espero que esté claro, pero vamos el procedimiento es fácil:


- Conectamos a la Base de Datos -> Extraemos Datos -> Instanciamos un gráfico -> Le pasamos como argumentos los datos extraídos -> Repetir hasta que no haya datos (while rs.next() ) y luego montar y enseñar el gráfico.






Si todo os ha salido bien, nos saldrá un gráfico de este estilo:


Histograma




Cabe destacara que hay un montón de tipos de gráficos. Yo he puesto el típico de Líneas, aunque tenemos de barras (bar), de área (areachart) y un montón más.


Algunos ejemplos de gráficos:









Espero que les haya servido de mucha ayuda, cualquier duda dejad un comentario.


Fuente: JFreeChart.com


Un saludo.

lunes, 21 de mayo de 2012

Ficheros Temporales en Java


Esto es una entrada un poco sencilla, pero no por ello quiera decir que no sea importante.

Los archivos temporales son muy importantes pues nos permiten almacenar datos sin tener que preocuparnos luego de borrar éste o de buscar la ruta donde guardamos el fichero. En fin, no hay mucho que explicar, si nos da igual si los datos se guardan o no, usaremos archivos temporales.


Para crear un fichero temporal, es simple, en las propiedades de File podemos verlo, aquí un enlace con toda la documentación de File



   ¡IMPORTANTE!
Como siempre en el manejo de archivos tenemos que controlar la excepción (aunque se nos avisará de ello) IOException.


Una cosa bastante importante que añadir es que el fichero no se borrará a menos que nosotros se lo indiquemos, para ello tenemos que borrarlo con .deleteOnExit(), aunque también tenemos delete() si lo queremos borrar cuando queramos.

Borrar cuando cerremos la aplicación  fTemporal.deleteOnExit();
Borrar en un momento determinado fTemporal.delete();


Ya solo nos queda trabajar con el fichero. Leer datos o escribir en él.




Podemos utilizar:

A) FileInputStream, FileOuputStream, FileReader o FileWriter

B) Los BufferedReader, BufferedInputStream, BufferedWriter y BufferedOutputStream


El grupo A) usan acceso directo al disco. Por lo que si vamos a realizar muchas lecturas o escrituras, no compensa además de que la velocidad de acceso al disco duro se va a notar bastante.

El grupo B) usan buffer, es decir, controlan el acceso al disco duro.

Dependiendo de lo que queramos escribir en nuestro fichero vamos a necesitar optar por uno u otro y en función a los requerimientos de acceso al disco duro. También cabe la posibilidad de que tengamos que escribir en nuestro fichero pasándole como argumento un(os) String(s) o por ejemplo Array de Bytes, con lo cual tenemos que hacerlo de una u otra manera.

Espero que os haya servido, cualquier duda dejen un comentario.

Un saludo :)

sábado, 5 de mayo de 2012

Cambiar color de las filas de una tabal (Jtable) en Java

En esta entrada os voy a comentar como hacer para cambiar los colores de las filas de un JTable en función de un valor o del valor de varios argumentos o celdas que vosotros queráis. Es algo realmente sencillo, ya veréis que con tan solo apenas 20 líneas de código se puede hacer... En este caso vamos a hacer que la tabla tenga las filas azules cuando el usuario este ACTIVO y que la fila esté roja cuando el usuario esté INACTIVO.

Me salto el paso de cómo crear la tabla ya que sino me va a quedar un código bastante amplio. Si alguien necesita que le diga como hacer una Tabla, ya sea con datos desde un archivo, desde BD, nada más que tiene que preguntarmelo.

Vamos allá.

Con la tabla montada, tenemos que hacer lo siguiente:

TablaClientes.setDefaultRenderer(Object.class, new FormatoTablaClientes());


Con esto estamos asignando un nuevo render a nuestra tabla. Para ello nos creamos una nueva clase FormatoTablaClientes que herede (extends) de DefaultTableCellRenderer.

El contenido de esta clase que hereda de DefaultTableCellRenderer es el siguiente:




import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class FormatoTablaUsuarios extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent
(JTable table, Object value, boolean selected, boolean focused, int row, int column)
{
        // SI EN CADA FILA DE LA TABLA LA CELDA 5 ES IGUAL A ACTIVO COLOR AZUL
if(String.valueOf(table.getValueAt(row,5)).equals("ACTIVO"))  setForeground(Color.blue);
                // SI NO ES ACTIVO ENTONCES COLOR ROJO
else  setForeground(Color.red);

super.getTableCellRendererComponent(table, value, selected, focused, row, column);
return this;
}
}




Si queremos que sea solamente el color de una celda, pues en este caso, solamente la celda de ACTIVO o INACTIVO deberíamos poner:   if(String.valueOf(table.getValueAt(row,column)).equals("ACTIVO"))

Podemos jugar con lo siguiente:

isSelected -> Si se selecciona la fila, columna, celda, etc... cambiar de color.
focused -> Si se ha hecho el foco sobre algo cambiar el color.

Y todo lo que se os ocurra.

Espero que os haya servido de ayuda y si tenéis cualquier duda sólo tenéis que preguntar :)

Un saludo.

viernes, 4 de mayo de 2012

Imprimir JTable directamente eligiendo impresora.


En esta entrada os voy a poner un ejemplo de como imprimir una Tabla en vuestra impresora directamente, es muy sencillo así que no tiene muchas florituras. 

La salida por la impresora será Un encabezado, la tabla en el cuerpo de la hoja y en el pie el número de página. 

public class Principal {
private static JButton btImprimir;

public static void main(String[] args) {
try {
 UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (ClassNotFoundException e) {
 e.printStackTrace();
} catch (InstantiationException e) {
 e.printStackTrace();
} catch (IllegalAccessException e) {
 e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
 e.printStackTrace();
}
JFrame v = new JFrame();
v.setBounds(0,0,835,360);
v.setLayout(null);
v.setVisible(true);
v.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final String [] columnas = {"NOMBRE", "APELLIDOS", "DNI", "ESTADO", "BLOQUEO", "ALTA"};
    
final DefaultTableModel dtm = new DefaultTableModel();
final JTable tabla1 = new JTable(dtm);
tabla1.setUpdateSelectionOnSort(true);
for (int i=0; i<6; i++){
dtm.addColumn(columnas[i]);
}
tabla1.setPreferredScrollableViewportSize(new Dimension(800,200));
JScrollPane scrollPane = new JScrollPane(tabla1);
v.add(scrollPane);
scrollPane.setBounds(10,10,800,200);
final Object [] fila2 = {"Carlos", "Mateo Ruiz", "71024121F", "ACTIVO", "0", "2012/02/02"};
final Object [] fila3 = {"Marta", "Perez Hidalgo", "29116227H", "ACTIVO", "1", "2010/21/10"};
dtm.addRow(fila2);
dtm.addRow(fila3);
btImprimir = new JButton("IMPRIMIR");
btImprimir.setBounds(10, 250, 120, 25);
v.add(btImprimir);
btImprimir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
        
                      try {
       
       
           // tabla1.print();//envia los datos de la tabla a la impresora
                 
                  MessageFormat headerFormat = new MessageFormat("Listado de Clientes 2010-2012);
                  MessageFormat footerFormat = new MessageFormat("- Página {0} -");
                  tabla.print(PrintMode.FIT_WIDTH, headerFormat, footerFormat);
                                   
                 
         } catch (PrinterException ex) {
             JOptionPane.showMessageDialog(null, "No se ha podido imprimir correctamente, intentalo más tarde.");
         }                 
                
            }
            
            
        });
v.repaint();
}