Datos de MySQL en Carpetas Java

   Una de las cosas que mas me han preguntado es ¿como muestro datos en forma de iconos?, ¿como mostrar un explorador?, ¿como mostrar carpetas con MySQL y Java?, y la más frecuente de todas (que a la larga todas son lo mismo), ¿Cómo muestro datos en carpetas o iconos como Windows en Java?. Para todas estas interrogantes hay preguntas, pero vamos que solo es cuestión de ponerse a pensar un buen rato.

   Para nadie es secreto el como se componen las vistas de iconos en el explorador de windows, y no solo en él, sino que en cualquier otro SO, lo cierto es que es simple y va de la siguiente manera:
icono + etiqueta = archivo listado

   Listo, así de simple, es cuestión de almacenar en algún lugar el icono para nuestras etiquetas (que de ahora en adelante las llamaré archivos para que se familiaricen más con esto) y mostrarlo al usuario. Entonces la pregunta es ¿como lo hago?, ¿como muestro una etiqueta (label) con icono?. Bien, supongamos que tenemos datos en nuestra "Base de Datos"...

   Digamos que tenemos una tabla llamada "Clientes", dentro de esta tenemos "Nombre, Dirección y Teléfono"... Suponiendo que ya sabemos conectar a la base de datos, hacemos dos (2) consulta simple en MySQL. Una nos devuelve la cantidad exacta de registros a mostrar (la almacenamos en una variable directa), la otra nos devuelve el nombre de cada registro a mostrar, estos datos no los trabajamos de forma directa, sino que los almacenamos en un arreglo para hacernos la vida más fácil de modo que le coloquemos un icono a nuestra etiqueta sin tantas trabas o problemas, entonces en nuestra consulta simplemente hacemos lo siguiente:
consulta = conexion.consulta("SELECT COUNT(*) FROM tabla");
while(consulta.next()){
    total_registros = Integer.parseInt(consulta.getString("COUNT(*)"));
}
String nombre_factura[] = new String [total_registros];
JLabel nombres[] = new JLabel[total_registros];
consulta = conexion.consulta("SELECT campos FROM tabla ORDER BY campo ASC");
while (consulta.next()) {                
    nombre_factura[i]=consulta.getString("el_campo_a_mostrar");                
    i++;
}
   Listo, con esto ya hemos agregado el icono a nuestra etiqueta, la cual se mostrara junto con el nombre.... Ah, pero falta lo importante, listar y preparar los datos (las etiquetas con iconos) para la edición, para ello debemos preparar un panel que almacene todas estas etiquetas.

   Creamos un JPanel el cual llamaremos "Contenido", dentro de el definiremos un Layout, este diseño (Layout) servirá para ordenar nuestra consulta, digamos las etiquetas. Podemos hacerlo en forma ascendente, descendente, de izquierda a derecha, de derecha a izquierda, cualquiera que sea el gusto es válido.
JPanel contenido = new JPanel();
javax.swing.GroupLayout contenidoLayout = new javax.swing.GroupLayout(contenido);
contenido.setLayout(contenidoLayout);
contenidoLayout.setHorizontalGroup(
    contenidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGap(0, 665, Short.MAX_VALUE)
);
contenidoLayout.setVerticalGroup(
    contenidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGap(0, 552, Short.MAX_VALUE)
);
   O bien, podemos hacerlo mas simple:
contenido.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));

   Ya por último, lo que nos queda es definir el estilo y forma en que se mostrarán los datos devueltos por nuestra consulta, es decir, como se verán los archivos:
nombres[i] = new JLabel(nombre_factura[i]);
nombres[i].setIcon(new ImageIcon(ruta));
nombres[i].setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
nombres[i].setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
nombres[i].setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
nombres[i].setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
nombres[i].addMouseListener(this);
   Una vez hecho todo esto, ya tenemos nuestro explorador de datos en forma de iconos, veamos un ejemplo completo. Para hacerlo mas simple aún, he dividido el código que lista los archivos dentro de un método en la misma clase, así podemos llamarlo cada vez que queramos listar la data:
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.GroupLayout;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

@SuppressWarnings("deprecation")
public class ListarIconos extends JFrame implements MouseListener {

	//Variables Necesarias
	JPanel contenido = new JPanel();
	JScrollPane scroll = new JScrollPane(contenido);
	private JLabel select;
	String nombre_registro;

	//Variables para la conexion
	static Connection conn = null;
	static ResultSet consulta = null;

	public ListarIconos() {
		//Definiciones
		super("Los Grupos");
		setLocation(100,100);
		setSize(230,270);
		add(scroll);

		show();
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		carga_iconos();
	}

	public void carga_iconos(){
        contenido.removeAll();
        contenido.repaint();
		URL ruta = getClass().getResource("carpeta.png");
		contenido.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
		int i=0, total_registros=0;
		try {
			consulta = this.consulta("SELECT COUNT(*) FROM clientes");
			while(consulta.next()){ total_registros = Integer.parseInt(consulta.getString("COUNT(*)"));}
			String nombre_factura[] = new String [total_registros];
			JLabel nombres[] = new JLabel[total_registros];
			consulta = this.consulta("SELECT * FROM clientes ORDER BY nombre ASC");
			while (consulta.next()) {
				nombre_factura[i]=consulta.getString("nombre");
				System.out.println(nombre_factura[i]);
				i++;
			} for (i=0;i<nombre_factura.length;i++){
				nombres[i] = new JLabel(nombre_factura[i]);
				nombres[i].setIcon(new ImageIcon(ruta));
				nombres[i].setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
				nombres[i].setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
				nombres[i].setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
				nombres[i].setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
				nombres[i].addMouseListener(this);
				contenido.add(nombres[i]);
			} contenido.validate();
		} catch (SQLException ex) {
			//Nada para la excepcion
		}
	}

	public static void abrir_bd(){
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn=DriverManager.getConnection("jdbc:mysql://servidor/bd", "usuario", "pass");
		} catch (SQLException ex) {
			JOptionPane.showMessageDialog(null, "Verifique que los parametros de conexión sean los correctos. n"+ex,"Error",JOptionPane.ERROR_MESSAGE);
			System.exit(0);
		} catch (ClassNotFoundException ex) {
			JOptionPane.showMessageDialog(null, "No es posible inicializar el sistema: n"+ex,"Error",JOptionPane.ERROR_MESSAGE);
			System.exit(0);
		}
	}

	public static ResultSet consulta (String peticion){
		try {
			Statement stat = conn.createStatement();
			consulta = stat.executeQuery(peticion);
		} catch (SQLException ex) {
			JOptionPane.showMessageDialog(null, "Error al realizar la consulta: n"+ex,"Error",JOptionPane.ERROR_MESSAGE);
		} return consulta;
	}

	public static void main(String[] arg) {
		JOptionPane.showMessageDialog(null,"Un Panel con Scrolln");
		JOptionPane.showMessageDialog(null,"By Carlitox ("+
		"http://calitoxenlaweb.blogspot.com)");
		abrir_bd();
		new ListarIconos();
	}

	//Los listener para el evento del mouse (aqui se pueden personalizar los efectos)
    public void mouseClicked(MouseEvent e) { }
    public void mousePressed(MouseEvent e) {
        if (e.getSource() instanceof JLabel){
            select = (JLabel) e.getSource();
            nombre_registro=select.getText();
            JOptionPane.showMessageDialog(null,"Registro Seleccionado: "+nombre_registro);
        }
    }
    public void mouseReleased(MouseEvent e) { }
    public void mouseEntered(MouseEvent e) { }
    public void mouseExited(MouseEvent e) { }
}
   Ya solo queda de nuestra parte obtener el nombre de la etiqueta donde se hace click, hacer que cambie de colo, cambiar el tipo de letra, o cualquier otra cosa que se nos ocurra para hacerlo mas agradable al usuario y con mayor efecto visual. Algo que recomiendo es utilizar un Panel con Scroll, tomando en cuenta que podemos hacer scroll para ver el resto de las etiquetas.

   NOTA: para poder ver el icono en el listado debemos guardar la imagen en el mismo directorio donde se compila nuestro proyecto...

2 Comentarios

Escribir Comentario

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión EmoticonEmoticon