The::Beastieux

Sangre de Bestia + Corazón de Pingüino | Un blog acerca de Linux, *BSD, Open Source, Software Libre, Programación …

Archivos en la Categoría: Java

Código Java – Modificar Ficheros de Propiedades en Tiempo de Ejecución


Este es el Ejemplo #23 del Topic: Programación Gráfica en Java.

Nuevamente jugando con el ResourceBundle y los ficheros de propiedades, pero a diferencia del post realizado anteriormente respecto a este tema ahora no solo veremos como acceder a los datos del fichero de propiedades, si no también poder editarlos.

Esto es muy importante porque su uso no radicará solo en desarrollar aplicaciones multi-lenguaje, sino para poder generar ficheros de configuración donde podamos almacenar datos que cambian esporádica o frecuentemente, por ejemplo, los de acceso a base de datos, establecer un idioma, una apariencia, los items seleccionados en las preferencias de la aplicación, directorios donde se almacenarán registros, etc, es decir, información externa que no requiera almacenarse en una base de datos al estilo de un cache, por ello usaremos simples ficheros de propiedades.

En el ejemplo siguiente usaremos los ficheros de propiedades creados en el post  Código Java – Internacionalización de Aplicaciones con ResourceBundle, la mayor parte del código es el mismo excepto que esta vez no nos enfocamos a la internacionalización.

Este es el procedimiento necesario para poder realizar nuestro objetivo, donde:

fichero: Ubicación del fichero .properties.
key: Palabra Clave dentro del fichero .properties.
values: Nuevo valor que reemplazará al anterior.

...
    private void escribirProperties(String fichero, String key, String value)
    {
                // Crear el objeto archivo
		File archivo = new File(this.getClass().getResource(fichero).getFile().replace("%20", " "));
		//Crear el objeto properties

                System.out.println(archivo);

		Properties properties = new Properties();
		try {
			// Cargar las propiedades del archivo
			properties.load(new FileInputStream(archivo));
			properties.setProperty(key,value);
			// Escribier en el archivo los cambios
                        FileOutputStream fos=new FileOutputStream(archivo.toString().replace("\\", "/"));

                        properties.store(fos,null);

                } catch (FileNotFoundException e) {
			System.out.println(e.getMessage());
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
    }
...

Código de Ejemplo:

/**
*Modificamos el valor del Keyword: beastieux.gui.Ejm19_Internacionalizacion.lbl3
*Del fichero /beastieux/language/LANG_es_PE.properties", creado en el Post 19.
 */

package beastieux.gui;

import java.awt.GridLayout;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.ResourceBundle;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

/**
 *
 * @author beastieux
 */
public class Ejm23_EscribirFicheroProperties extends JFrame {

    JLabel lbl1;
    JLabel lbl2;
    JLabel lbl3;
    JTextField txt1;
    JTextField txt2;
    JTextField txt3;
    JComboBox cmb1;
    JButton btn1;

    public Ejm23_EscribirFicheroProperties()
    {

        lbl1=new JLabel();
        txt1=new JTextField();

        lbl2=new JLabel();
        txt2=new JTextField();

        lbl3=new JLabel();
        cmb1=new JComboBox();
        cmb1.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cmb1ItemStateChanged(evt);
            }
        });

        cmb1.addItem("Español");

        txt3=new JTextField();

        btn1=new JButton("Cambiar Etiqueta 3");
        btn1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn1ActionPerformed(evt);
            }
        });

        this.add(lbl1);
        this.add(txt1);
        this.add(lbl2);
        this.add(txt2);
        this.add(lbl3);
        this.add(cmb1);
        this.add(btn1);
        this.add(txt3);
        this.setLayout(new GridLayout(4,2));
        this.setSize(500, 150);

        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }

    private void btn1ActionPerformed(java.awt.event.ActionEvent evt) {
        ResourceBundle.clearCache();
        escribirProperties("/beastieux/language/LANG_es_PE.properties",
                           "beastieux.gui.Ejm19_Internacionalizacion.lbl3",
                           this.txt3.getText());

        setBundles("beastieux.language.LANG_es_PE");
    }

    private void cmb1ItemStateChanged(java.awt.event.ItemEvent evt) {

        switch(cmb1.getSelectedIndex())
        {
            case 1:setBundles("beastieux.language.LANG_es_PE"); break;
            default:setBundles("beastieux.language.LANG");
        }
    }

    private void setBundles(String propertyFile)
    {
            ResourceBundle rb = ResourceBundle.getBundle(propertyFile);

            String keyBundle="beastieux.gui.Ejm19_Internacionalizacion";

            this.setTitle(rb.getString(keyBundle + ".this"));
            this.lbl1.setText(rb.getString(keyBundle + ".lbl1"));
            this.lbl2.setText(rb.getString(keyBundle + ".lbl2"));
            this.lbl3.setText(rb.getString(keyBundle + ".lbl3"));

    }

    private void escribirProperties(String fichero, String key, String value)
    {
                // Crear el objeto archivo
		File archivo = new File(this.getClass().getResource(fichero).getFile().replace("%20", " "));
		//Crear el objeto properties

                System.out.println(archivo);

		Properties properties = new Properties();
		try {
			// Cargar las propiedades del archivo
			properties.load(new FileInputStream(archivo));
			properties.setProperty(key,value);
			// Escribier en el archivo los cambios
                        FileOutputStream fos=new FileOutputStream(archivo.toString().replace("\\", "/"));

                        properties.store(fos,null);

                } catch (FileNotFoundException e) {
			System.out.println(e.getMessage());
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
    }

        public static void main(String args[]) {
        Ejm23_EscribirFicheroProperties obj = new Ejm23_EscribirFicheroProperties();
        obj.setVisible(true);
    }
}

Código Java – Autoajustar Imágenes en un Contenedor


Este es el Ejemplo #22 del Topic: Programación Gráfica en Java.

Con el siguiente ejemplo aprenderemos a subir imágenes para mostrarlos en nuestros contenedores de java, y no solo eso, si no también como deben ser autoajustados al contenedor en el que se encuentra, de esa manera eliminamos los problemas de escalamiento que suele ocurrir por defecto si no se hace uso de una función que realice este trabajo.

Para este ejemplo contamos con 2 funciones básicas, la primera para presentar la imágen y la otra para autoajustarlo al componente que lo contiene:

...
    private void setImagen()
    {
        lbl.setIcon(ajustarImagen("/home/beastieux/MiImagen.png"));
        lbl.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
    }
...
...
    private ImageIcon ajustarImagen(String ico)
    {
        ImageIcon tmpIconAux = new ImageIcon(ico);
        //Escalar Imagen
        ImageIcon tmpIcon = new ImageIcon(tmpIconAux.getImage().getScaledInstance(200, 200, Image.SCALE_DEFAULT));
        return tmpIcon;
    }
...

Código de Ejemplo:

package beastieux.gui;

import java.awt.FlowLayout;
import java.awt.Image;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

/**
 *
 * @author beastieux
 */
public class Ejm22_SubirImagen extends JFrame {

    JLabel lbl;

    public Ejm22_SubirImagen()
    {
        lbl = new JLabel();

        this.add(lbl);
        this.setSize(200,200);
        this.setLayout(new FlowLayout());
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

    }

    private void setImagen()
    {
        lbl.setIcon(ajustarImagen("/home/beastieux/MiImagen.png"));
        lbl.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
    }

    private ImageIcon ajustarImagen(String ico)
    {
        ImageIcon tmpIconAux = new ImageIcon(ico);
        //Escalar Imagen
        ImageIcon tmpIcon = new ImageIcon(tmpIconAux.getImage().getScaledInstance(200, 200, Image.SCALE_DEFAULT));
        return tmpIcon;
    }

    public static void main(String args[])
    {
        Ejm22_SubirImagen obj=new Ejm22_SubirImagen();
        obj.setVisible(true);
        obj.setImagen();
    }

}

Código Java – Redimensionar Matrices sin Borrar Registros con Redim Preserve


Este es el Ejemplo #21 del Topic: Programación Gráfica en Java.

Este será un post corto. Muchas veces mientras programamos hemos tenido la necesidad de re-dimensionar las matrices que ya hemos declarado sin perder los datos que ya tengamos registrados en ella, pues esto es tarea sencilla en otros lenguajes de programación pero no quiere decir que en java no lo sea. El siguiente procedimiento se encargará de ello. Lo que hará es recibir una matriz y un entero indicando el nuevo tamaño de la matriz y lo redimencionará automáticamente:

...
    public void redimPreserve(Object obj[],int i)
    {
        if(i>obj.length)
        {
            Object[] tempVar = new Object[i];
            if (obj != null)
                    System.arraycopy(obj, 0, tempVar, 0, Math.min(obj.length, tempVar.length));
            obj = tempVar;
        }
    }
...

Código de Ejemplo:

package beastieux.gui;

import javax.swing.JOptionPane;

/**
 *
 * @author beastieux
 */
public class Ejm21_RedimPreserve {

    public void redimPreserve(Object obj[],int i)
    {
        if(i>obj.length)
        {
            Object[] tempVar = new Object[i];
            if (obj != null)
                    System.arraycopy(obj, 0, tempVar, 0, Math.min(obj.length, tempVar.length));
            obj = tempVar;
        }
    }

    public static void main(String args[])
    {
        Ejm21_RedimPreserve obj = new Ejm21_RedimPreserve();

        String []a_num;

        a_num = new String[] {"1","2","3"};
        for(int i=0;i<a_num.length;i++)
            JOptionPane.showMessageDialog(null, a_num[i]);

        obj.redimPreserve(a_num,5);

        JOptionPane.showMessageDialog(null, "Después del redim preserve");

        a_num = new String[] {"1","2","3","4","5"};

        for(int i=0;i<a_num.length;i++)
            JOptionPane.showMessageDialog(null, a_num[i]);
    }
}

Código Java – Abrir Reportes Creados con JasperReports


Este es el Ejemplo #20 del Topic: Programación Gráfica en Java.

Los reportes son otras de las utilidades más importantes en las aplicaciones ya que su función es dar al usuario información ordenada y limpia así como un formato adecuado para poder ser llevado a impresión o almacenarlo en algún tipo de fichero como .doc, .odt, pdf, etc.

Recuerdo que hace muchos post anteriores hablé sobre JasperReports, una herramienta Open Source para emitir reportes en Java. Pueden usarlo externamente descargándolo desde jasperforge, o instalar el complemento en netbeans como se explicó en el post mencionado (Instalación de JasperReports).

El siguiente paso es realizar el reporte, que no es nada complicado, basta con establecer la conexión a la base de datos que deseemos, arrastrar los campos de las tablas que necesitemos y ordenarlos, darle un formato decente y ya está, al guardarlo debe generarse un fichero .jrxml, al cual invocaremos desde nuestro código fuente.

Antes de continuar, debemos contar en el proyecto con la librería:

jasperreports-3.7.6.jar

Si antes se instaló el JasperReports es posible que la librería ya lo tengamos en el ordenador, incluso el IDE de desarrollo lo tiene indexado, solo deberá ser añadido a proyecto.

Otras de la librerías que necesitaremos están comentados en el encabezado del código de Ejemplo.

El siguiente procedimiento va a recibir como parámetro la ubicación del reporte dentro del proyecto, para ello será necesario incluir los reportes en algún directorio dentro del proyecto en el que trabajamos, en mi caso la estructura es la siguiente:

beastieux --> reports --> MyReporte.jrxml

...

 private void abrirReporte(String archivo)

    {

        try {

            JasperReport report = JasperCompileManager.compileReport(archivo);

            JasperPrint print = JasperFillManager.fillReport(report, new HashMap(), coneccionSQL());

            JasperViewer.viewReport(print, false);

        } catch (JRException jRException) {

            System.out.println(jRException.getMessage());

        }

    }

...

La linea de código encargada de general la ruta absoluta de la ubicación del reporte es el siguiente:


...

getClass().getResource("/beastieux/reports/MiReporte.jrxml").getPath()

...

Además, algo muy importante que se necesita para abrir el reporte es la conexión a la base de datos. En este ejemplo lo hice con PostgreSQL, ustedes pueden hacerlo con el que gusten, pueden verlos en los ejemplos de conexión a diferentes base de datos realizados en los post anteriores de este tutorial. Como observarán, la función coneccionSQL() nos retorna la conexión a la base de datos, el cual será usado directamente como tercer parámetro en la linea:


...

JasperPrint print = JasperFillManager.fillReport(report, new HashMap(), coneccionSQL());

...

Código de Ejemplo:


 /**

 * jasperreports-3.7.6.jar

 * commons-digester-1.7.jar

 * commons-logging-1.0.4.jar

 * commons-collections-2.1.1.jar

 * commons-beanutils-1.8.0.jar

 */

package beastieux.gui;

import java.awt.CardLayout;

import java.sql.Connection;

import java.sql.DriverManager;

import java.util.HashMap;

import javax.swing.JButton;

import javax.swing.JFrame;

import net.sf.jasperreports.engine.JRException;

import net.sf.jasperreports.engine.JasperCompileManager;

import net.sf.jasperreports.engine.JasperFillManager;

import net.sf.jasperreports.engine.JasperPrint;

import net.sf.jasperreports.engine.JasperReport;

import net.sf.jasperreports.view.JasperViewer;

/**

 *

 * @author beastieux

 */

public class Ejm20_JasperReport extends JFrame {

    public Ejm20_JasperReport()

    {

        JButton btn1=new JButton("Abrir Reporte");

            btn1.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {

                btn1ActionPerformed(evt);

            }

        });

        this.add(btn1);

        this.setLayout(new CardLayout());

        this.setSize(200,100);

        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

    }

    private void btn1ActionPerformed(java.awt.event.ActionEvent evt) {

        abrirReporte(getClass().getResource("/beastieux/reports/MiReporte.jrxml").getPath());

    }

    private void abrirReporte(String archivo)

    {

        try {

            JasperReport report = JasperCompileManager.compileReport(archivo);

            JasperPrint print = JasperFillManager.fillReport(report, new HashMap(), coneccionSQL());

            JasperViewer.viewReport(print, false);

        } catch (JRException jRException) {

            System.out.println(jRException.getMessage());

        }

    }

    private Connection coneccionSQL()

    {

            try

            {

                    String cadena;

                    cadena="jdbc:postgresql://127.0.0.1:5432/postgres";

                    Class.forName("org.postgresql.Driver");

                    Connection con = DriverManager.getConnection(cadena, "usuario","contraseña");

                    return con;

            }

            catch(Exception e)

            {

                   System.out.println(e.getMessage());

            }

            return null;

    }

    public static void main(String args[])

    {

        Ejm20_JasperReport obj = new Ejm20_JasperReport();

        obj.setVisible(true);

    }

}

Debemos tener especial cuidado con los reportes creados en diferentes sistemas operativos, mas que nada en los tipos de letras usado (Tipografía), por ejemplo creas el reporte en Windows haciendo uso de Times New Roman te podría generar un error si lo tratas de abrir en Linux o viceversa, al final, eso se corrige en el archivo jrxml generado en las partes donde hace mención a la fuente.

Código Java – Internacionalización de Aplicaciones con ResourceBundle


Este es el Ejemplo #19 del Topic: Programación Gráfica en Java.

Con este post aprenderemos a hacer nuestras aplicaciones en java internacionales y poder generar software en varios idiomas como queramos. Esto yo es algo que la mayoría de las aplicaciones lo vienen realizando sean de escritorio o aplicaciones web que hacen uso de la internacionalización, que no es otra cosa más que adaptar nuestro software a diferentes idiomas y regiones, todo ello sin necesidad de hacer cambios considerables en el código fuente, sino haciendo uso de ficheros de propiedades que nos serán de gran ayuda.

En Java debemos acceder a la clase ResourceBundle que deberá enlazarse con el fichero de propiedades(.properties) y de esa manera obtener el recurso a usar. Deberán existir tantos ficheros de propiedades como idiomas que soportará la aplicación, cuyo nombre del fichero deberá guardar relación con los siguientes estándares:

Para el idioma – ISO 639.
Para el país – ISO3166

La composición del nombre de identificación deberá contar con el NombreFichero_pais_IDIOMA; respetando mayúsculas y minúsculas:
LANG_en_US – Inglés/EE.UU
LANG_es_PE – Español/Perú

El fichero de propiedades deberá contener la palabra clave y el texto con el cual está relacionado. La palabra clave deberá ser la misma en todos los ficheros de cada idioma, por ejemplo:

LANG_en_US.properties
IDIOMA=Spanish

LANG_es_PE.properties
IDIOMA=Español

Al momento de construir los ficheros properties de la aplicación,algunos programadores suelen usar el nombre del componente como palabra clave, yo prefiero poner como palabra clave la ruta completa de los componentes, y cuando sea necesaria alguna propiedad, por ejemplo hago uso de this cuando me refiero el contenedor principal.
En este ejemplo, el directorio donde estarán ubicados los ficheros de propiedades guardará la siguiente organización:

Para efectos didácticos solo usaré 2 idiomas, Ingles (en_US), y español (es_PE), además del fichero que se usará por defecto identificado solo como LANG.properties. Cada uno de estos ficheros deberá contener los siguientes datos:

LANG_en_US.properties
beastieux.gui.Ejm19_Internacionalizacion.this=Configuration
beastieux.gui.Ejm19_Internacionalizacion.lbl1=Country
beastieux.gui.Ejm19_Internacionalizacion.lbl2=City
beastieux.gui.Ejm19_Internacionalizacion.lbl3=Language

LANG_es_PE.properties
beastieux.gui.Ejm19_Internacionalizacion.this=Configuración
beastieux.gui.Ejm19_Internacionalizacion.lbl1=País
beastieux.gui.Ejm19_Internacionalizacion.lbl2=Ciudad
beastieux.gui.Ejm19_Internacionalizacion.lbl3=Idioma

El siguiente procedimiento recibirá como único parámetro la ruta del fichero de propiedades ejm: beastieux.language.LANG_en_US, y seteará el ResourceBundle con los datos de dicho fichero, con el cual cambiará automáticamente al idioma definido.

...
    private void setBundles(String propertyFile)
    {
            ResourceBundle rb = ResourceBundle.getBundle(propertyFile);

            String keyBundle=this.getClass().getName();

            this.setTitle(rb.getString(keyBundle + ".this"));
            this.lbl1.setText(rb.getString(keyBundle + ".lbl1"));
            this.lbl2.setText(rb.getString(keyBundle + ".lbl2"));
            this.lbl3.setText(rb.getString(keyBundle + ".lbl3"));
    }
...

Código de Ejemplo:

package beastieux.gui;

import java.awt.GridLayout;
import java.util.ResourceBundle;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

/**
 *
 * @author beastieux
 */
public class Ejm19_Internacionalizacion extends JFrame{

    JLabel lbl1;
    JLabel lbl2;
    JLabel lbl3;
    JTextField txt1;
    JTextField txt2;
    JComboBox cmb1;

    public Ejm19_Internacionalizacion()
    {

        lbl1=new JLabel();
        txt1=new JTextField();

        lbl2=new JLabel();
        txt2=new JTextField();

        lbl3=new JLabel();

        cmb1=new JComboBox();
        cmb1.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cmb1ItemStateChanged(evt);
            }
        });

        cmb1.addItem("Inglés");
        cmb1.addItem("Español");

        this.add(lbl1);
        this.add(txt1);
        this.add(lbl2);
        this.add(txt2);
        this.add(lbl3);
        this.add(cmb1);

        this.setLayout(new GridLayout(3,2));
        this.setSize(400, 100);

        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }

    private void cmb1ItemStateChanged(java.awt.event.ItemEvent evt) {

        switch(this.cmb1.getSelectedIndex())
        {
            case 0:setBundles("beastieux.language.LANG_en_US"); break;
            case 1:setBundles("beastieux.language.LANG_es_PE"); break;
            default:setBundles("beastieux.language.LANG");
        }
    }

    private void setBundles(String propertyFile)
    {
            ResourceBundle rb = ResourceBundle.getBundle(propertyFile);

            String keyBundle=this.getClass().getName();

            this.setTitle(rb.getString(keyBundle + ".this"));
            this.lbl1.setText(rb.getString(keyBundle + ".lbl1"));
            this.lbl2.setText(rb.getString(keyBundle + ".lbl2"));
            this.lbl3.setText(rb.getString(keyBundle + ".lbl3"));

    }

    public static void main(String args[]) {
        Ejm19_Internacionalizacion obj = new Ejm19_Internacionalizacion();
        obj.setVisible(true);
    }

}

Finalmente, cabe mencionar que los IDE’s de desarrollo modernos nos permiten realizar esta tarea fácilmente como es el caso de NetBeans o Eclipse. El procedimiento en Netbeans seria ir al menu Tools –> Internationalization, y elegir la modalidad, el más sencillo es con Internationalization Wizard.

Código Java – Cambiar la Apariencia de la Interfaz Gráfica con LookAndFeel


Este es el Ejemplo #18 del Topic: Programación Gráfica en Java.

En este post vamos a jugar un poco porque aprenderemos a cambiar la apariencia de todos los componentes y contenedores de Java haciendo uso de las librerías del tipo LookAndFeel, todo esto con tan solo unas cuantas lineas de código que servirá para todo el proyecto sin importar de cuantos formularios o frames esté compuesto.

El Framework de java trae ya incluido algunos diseños que podemos usar directamente, esto no quiere decir que sean los únicos, los LookAndFeel podemos crearlo nosotros, personalizarlo o conseguirlo por medio de terceros. En este ejemplo muestro los que trae por defecto y agrego uno más a las librerías del proyecto, que lo encontré en los repositorios de Google Code y me por cierto se ve muy bien; es el seaglasslookandfeel.

Descargar: SeaGlassLookAndFeel

El código mostrará un frame con algunos componentes típicos añadidos, y en un ComboBox, los estilos que tomarán inmediatamente al seleccionarlo. Para empezar, muestro la función que creo es la esencia, el cual recibirá como parámetro el estilo que se dará a la GUI:

...
    private void setLookAndFeel(String laf)
    {

            if (laf==null) {
                    laf=UIManager.getSystemLookAndFeelClassName();
            }
            else
            {
                try {
                        UIManager.setLookAndFeel(laf);
                } catch (InstantiationException ex) {

                } catch (ClassNotFoundException ex) {

                } catch (UnsupportedLookAndFeelException ex) {

                } catch (IllegalAccessException ex) {

                }
            }
            SwingUtilities.updateComponentTreeUI(this);
    }
...

Código de Ejemplo:

/**
* seaglasslookandfeel-0.1.5.jar
*/
package beastieux.gui;

import java.awt.GridLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

/**
 *
 * @author beastieux
 */
public class Ejm18_LookAndFeel extends JFrame {

    JComboBox cmb1=new JComboBox();

    public Ejm18_LookAndFeel()
    {
        JPanel pnlEjemplo=new JPanel();

        JTextField txt1=new JTextField();
        
        JCheckBox chk1=new JCheckBox("Opcion 1");


        cmb1.setModel(new DefaultComboBoxModel
                     (new String[] { "Estilo MetalLookAndFeel",
                                     "Estilo MotifLookAndFeel",
                                     "Estilo GTKLookAndFeel",
                                     "Estilo NimbusLookAndFeel",
                                     "Estilo WindowsLookAndFeel",
                                     "Estilo SeaGlassLookAndFeel" }));

        cmb1.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cmb1ItemStateChanged(evt);
            }
        });


        JButton btn1=new JButton("Button 1");


        pnlEjemplo.add(txt1);
        pnlEjemplo.add(cmb1);
        pnlEjemplo.add(chk1);
        pnlEjemplo.add(btn1);

        pnlEjemplo.setLayout(new GridLayout(5,1));

        this.add(pnlEjemplo);
        this.setSize(500, 150);

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    }


    private void cmb1ItemStateChanged(java.awt.event.ItemEvent evt) {

        switch(cmb1.getSelectedIndex())
        {
            case 0:
                    setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
                    break;
            case 1:
                    setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); 
                    break;
            case 2:
                    setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); 
                    break;
            case 3:
                    setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
                    break;
            case 4:
                    setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
                    break;
            case 5:
                    setLookAndFeel("com.seaglasslookandfeel.SeaGlassLookAndFeel"); 
                    break;
            default:
                    setLookAndFeel(null);
        }
    }

    private void setLookAndFeel(String laf)
    {

            if (laf==null) {
                    laf=UIManager.getSystemLookAndFeelClassName();
            }
            else
            {
                try {
                        UIManager.setLookAndFeel(laf);
                } catch (InstantiationException ex) {

                } catch (ClassNotFoundException ex) {

                } catch (UnsupportedLookAndFeelException ex) {

                } catch (IllegalAccessException ex) {

                }
            }
            SwingUtilities.updateComponentTreeUI(this);
    }

    public static void main(String args[]) {
        Ejm18_LookAndFeel obj = new Ejm18_LookAndFeel();
        obj.setVisible(true);
    }
}

Código Java – Agregar un Componente JCalendar al Proyecto


Este es el Ejemplo #17 del Topic: Programación Gráfica en Java.

En el post anterior hablamos sobre los CheckBoxList, ahora tocaremos otro componente también importante y muy usado que es el Calendar. He encontrado muchos componentes de este tipo pero la mayoría de ellos de pago y otros gratuitos pero sin buen diseño. Al final pude encontrar algo en SourceForge y seguramente podría servirnos mucho; es un JCalendar en dos presentaciones, un frame del calendar como tal y la otra modalidad incrustada en un combo.

Descargar: JCalendar.jar

Luego de descargar el JCalendar.jar vamos a importarlo al proyecto. Para que sea más accesible en el futuro podemos agregar el componente al panel de Beans de la IDE en el cual estamos trabajando y de esa manera solo tendremos que arrastrarlo al contenedor cada vez que tengamos que usarlo.

En el siguiente ejemplo agrego ambas presentaciones del JCalendar a JFrame:

/**
* jcalendar.jar
 */

package beastieux.gui;

import java.awt.FlowLayout;
import javax.swing.JFrame;
import org.freixas.jcalendar.JCalendar;
import org.freixas.jcalendar.JCalendarCombo;

/**
 *
 * @author beastieux
 */
public class Ejm17_JCalendar extends JFrame {
    public Ejm17_JCalendar()
    {
      JCalendar calEjemplo1=new  JCalendar();
      JCalendarCombo calEjemplo2=new  JCalendarCombo();

      this.add(calEjemplo1);
      this.add(calEjemplo2);
      this.setLayout(new FlowLayout());
      this.setSize(400, 300);

      setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    }

    public static void main(String args[]) {
        Ejm17_JCalendar obj = new Ejm17_JCalendar();
        obj.setVisible(true);
    }
}

Código Java – Agregar un Componente CheckBoxList al Proyecto


Este es el Ejemplo #16 del Topic: Programación Gráfica en Java.

A menudo necesitamos hacer uso de algunos componentes especiales pero no contamos con ellos, a veces lo que nos ofrece la plataforma de desarrollo no nos es suficiente y la opción está en crear nuestros propios componentes. Pero sin embargo existe otra posibilidad como comprar componentes de terceros o conseguirlo de manera gratuita, apuesto a que la mayoría lo prefiere de la última forma. Recuerdo que hace tiempo hice un post sobre un buscador de componentes gratuitos para java, es lo que nos ayudará en esta oportunidad.

Uno de esos componentes que tanto necesitamos es el CheckBoxList o CheckListBox como prefieran llamarlo, el cual no lo obtenemos en la lista de componentes por defecto, por lo menos no en NetBeans u otros que he visto, por ello vamos a descargarlo e importarlo al proyecto que estamos desarrollando.

Una vez importado, dentro del JAR descargado tendremos varios otros componentes, pero lo que nos interesa probar ahora es el CheckBoxList que se encuentra en:

com.jidesoft.swing.CheckBoxList

De todos los componentes de este tipo que he encontrado y probado puedo decirles que este es el más recomendado para usarlo. Ahora veamos un ejemplo de como se usa , verán que es super sencillo:

/**
* jide-oss-2.4.8.jar
*/
package beastieux.gui;

import com.jidesoft.swing.CheckBoxList;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JScrollPane;

/**
 *
 * @author beastieux
 */

public class Ejm16_JCheckListBox extends JFrame {

 public Ejm16_JCheckListBox()
 {
 CheckBoxList cblEjemplo = new CheckBoxList();
 JScrollPane scpEjemplo=new JScrollPane();

 DefaultListModel lmdlEjemplo=new DefaultListModel();

 lmdlEjemplo.addElement("Item 0");
 lmdlEjemplo.addElement("Item 1");
 lmdlEjemplo.addElement("Item 2");
 lmdlEjemplo.addElement("Item 3");
 lmdlEjemplo.addElement("Item 4");
 lmdlEjemplo.addElement("Item 5");
 lmdlEjemplo.addElement("Item 6");
 lmdlEjemplo.addElement("Item 7");
 lmdlEjemplo.addElement("Item 8");
 lmdlEjemplo.addElement("Item 9");

 cblEjemplo.setModel(lmdlEjemplo);

 scpEjemplo.add(cblEjemplo);
 this.add(scpEjemplo);

 scpEjemplo.setViewportView(cblEjemplo);
 scpEjemplo.setSize(100, 150);
 this.setLayout(null);
 this.setSize(300, 400);

 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
 }

 public static void main(String args[]) {
 Ejm16_JCheckListBox obj = new Ejm16_JCheckListBox();
 obj.setVisible(true);
 }
}

Código Java – Conexión a Base de Datos Apache Derby (Embebida y Cliente – Servidor)


Este es el Ejemplo #12.3 del Topic: Programación Gráfica en Java, que viene a formar parte del Topic #12 Código Java – Establecer Conexión a Base de Datos con JDBC

Como he explicado en el Topic #12, para realizar las conexiones necesitaremos los drivers respectivos, de acuerdo al motor de base de datos al cual deseemos conectarnos. En este ejemplo estableceremos una conexión con Apache Derby en sus modalidades Embebida y Cliente-Servidor, para el cual es necesario contar con las respectivas librería que pueden ser similares a las que se muestran a continuación:

derby.jar (Embebida)
derbyclient.jar (Cliente - Servidor)

Estas dos librerías corresponden para una base de datos Apache Derby Embebida y Cliente Servidor respectivamente. Si Derby ha sido instalada de la modalidad mostrada en el post Instalación y Ejecución de Apache Derby en Linux, las librerías podrán ubicarse en las siguientes rutas:

/usr/lib/jvm/java-6-sun/db/lib/derby.jar
/usr/lib/jvm/java-6-sun/db/lib/derbyclient.jar

En caso contrario, las librerías deberán ser obtenidas de medios externos.

Ustedes deberán conseguir la librería de acuerdo a la versión de Derby al cual deseen conectarse y establecer los parámetros de conexión como se muestra en el código siguiente:

Conexión a Base de Datos Derby Cliente – Sevidor:

package beastieux.gui;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import javax.sql.rowset.CachedRowSet;
import com.sun.rowset.CachedRowSetImpl;
/**
 *
 * @author beastieux
 */
public class Ejm12_3_ConectarDerby {

    public CachedRowSet Function(String sql)
    {
            try
            {
                    Class.forName("org.apache.derby.jdbc.ClientDriver");

                    String url = "jdbc:derby://localhost:1527/dbtest";

                    Connection con = DriverManager.getConnection(url);
                    Statement s = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                                      ResultSet.CONCUR_READ_ONLY);

                    ResultSet rs= s.executeQuery(sql);

                    CachedRowSet crs = new CachedRowSetImpl();
                    crs.populate(rs);

                    rs.close();
                    s.close();
                    con.close();

                    return crs;

            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }

            return null;
    }

    public void StoreProcedure(String sql)
    {

            try
            {
                    Class.forName("org.apache.derby.jdbc.ClientDriver");

                    String url = "jdbc:derby://localhost:1527/dbtest";
                    Connection con = DriverManager.getConnection(url);
                    Statement s = con.createStatement();

                    s.execute(sql);

                    s.close();
                    con.close();

            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }
    }
}

Conexión a Base de Datos Derby Embebida:

package beastieux.gui;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import javax.sql.rowset.CachedRowSet;
import com.sun.rowset.CachedRowSetImpl;
/**
 *
 * @author beastieux
 */
public class Ejm12_3_ConectarDerby {

    public CachedRowSet Function(String sql)
    {
            try
            {
                    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

                    String url = "jdbc:derby:/home/beastieux/dbtest";

                    Connection con = DriverManager.getConnection(url);
                    Statement s = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                                      ResultSet.CONCUR_READ_ONLY);

                    ResultSet rs= s.executeQuery(sql);

                    CachedRowSet crs = new CachedRowSetImpl();
                    crs.populate(rs);

                    rs.close();
                    s.close();
                    con.close();

                    return crs;

            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }

            return null;
    }

    public void StoreProcedure(String sql)
    {

            try
            {
                    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

                    String url = "jdbc:derby:/home/beastieux/dbtest";
                    Connection con = DriverManager.getConnection(url);
                    Statement s = con.createStatement();

                    s.execute(sql);

                    s.close();
                    con.close();

            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }
    }
}

En el caso de conexión a base de datos embebida, la URL contiene la ubicación de la base de datos la cual deberá ser reemplazado de acuerdo a su propia configuración:

String url = "jdbc:derby:/home/beastieux/dbtest";

Código Java – Función para Convertir un ResultSet a Array


Este es el Ejemplo #15 del Topic: Programación Gráfica en Java.

Antes había explicado como retornar una consulta a base de datos mediante un CacheRowSet, Ahora explicaré otra de las formas que existe para retornar los datos pasándolos desde un ResultSet hacia un array.

La siguiente función actuará dentro del método que se encargará de establecer la conexión y retornar los datos en forma de un arreglo.

...
    private Object[][] ResultSetToArray(ResultSet rs)
    {
        Object obj[][]=null;

        try
        {

        rs.last();

        ResultSetMetaData rsmd = rs.getMetaData();

        int numCols = rsmd.getColumnCount();

        int numFils =rs.getRow();

        obj=new Object[numFils][numCols];
        int j = 0;

        rs.beforeFirst();

        while (rs.next())
        {
            for (int i=0;i<numCols;i++)
            {

                obj[j][i]=rs.getObject(i+1);
            }
            j++;

        }

        }
        catch(Exception e)
        {

        }

        return obj;
    }
...

Código de Ejemplo:

package beastieux.gui;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author beastieux
 */
public class Ejm15_ResultSetToArray extends JFrame {

    public Ejm15_ResultSetToArray()
    {
        JTable tblEjemplo = new JTable();
        JScrollPane scpEjemplo= new JScrollPane();

        //Llenamos el modelo
        DefaultTableModel dtmEjemplo = new DefaultTableModel(getFilas(),
                                                             getColumnas());

        tblEjemplo.setModel(dtmEjemplo);
        scpEjemplo.add(tblEjemplo);
        this.add(scpEjemplo);
        this.setSize(500, 200);

        scpEjemplo.setViewportView(tblEjemplo);

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    }

    //Datos de las filas
    private Object[][] getFilas()
    {
         Object fila[][]=FuncionPostgreSQL("SELECT * FROM tabla");
         return fila;
    }

    //Encabezados de la tabla
    private String[] getColumnas()
    {
          String columna[]=new String[]{"Columna1","Columna2","Columna3"};
          return columna;
    }

    private Object[][] ResultSetToArray(ResultSet rs)
    {
        Object obj[][]=null;

        try
        {

        rs.last();

        ResultSetMetaData rsmd = rs.getMetaData();

        int numCols = rsmd.getColumnCount();

        int numFils =rs.getRow();

        obj=new Object[numFils][numCols];
        int j = 0;

        rs.beforeFirst();

        while (rs.next())
        {
            for (int i=0;i<numCols;i++)
            {

                obj[j][i]=rs.getObject(i+1);
            }
            j++;

        }

        }
        catch(Exception e)
        {

        }

        return obj;
    }

    private Object[][] FuncionPostgreSQL(String sql)
    {

            try
            {
                    Class.forName("org.postgresql.Driver");
                    String url = "jdbc:postgresql://127.0.0.1:5432/postgres";

                    Connection con = DriverManager.getConnection(url, "usuario","contraseña");
                    Statement s = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                                      ResultSet.CONCUR_READ_ONLY);

                    ResultSet rs = s.executeQuery(sql);
                    Object[][] arr = ResultSetToArray(rs);

                    s.close();
                    rs.close();
                    con.close();

                    return arr;

            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }

            return null;
    }

    public static void main(String args[]) {
        Ejm15_ResultSetToArray obj = new Ejm15_ResultSetToArray();
        obj.setVisible(true);
    }

}

Código Java – Procedimiento para llenar un JTable desde un CachedRowSet


Este es el Ejemplo #14 del Topic: Programación Gráfica en Java.

En un post anterior se ha definimos a un CachedRowSet como un Resultset con privilegios de manipulación al mantener la conexión cerrada.
El siguiente procedimiento se encargará de pasar los datos contenidos en un CachedRowSet hacia un JTable teniendo como puente a un modelo construido previamente, este procedimiento simplificará la tarea al momento de querer realizar el llenado de un JTable a partir de una CachedRowSet.

...
    private void CachedRowSetToJTable(CachedRowSet crs, DefaultTableModel modelo,JTable tbl)
    {

        try
        {
                ResultSetMetaData rsmd = crs.getMetaData();
                int numCols = rsmd.getColumnCount();

                modelo.setRowCount(0);

                Object []datos = new Object[numCols];

                while (crs.next())
                {
                    for (int i=0;i<numCols;i++)
                    {
                            datos[i]=crs.getObject(i+1);
                    }

                    modelo.addRow(datos);
                }
                tbl.setModel(modelo);
                crs.close();

        }
        catch(Exception e)
        {
                System.out.println(e.getMessage());
        }
    }
...

Código de Ejemplo:

package beastieux.gui;

import java.sql.ResultSetMetaData;
import javax.sql.rowset.CachedRowSet;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author beastieux
 */
public class Ejm14_CachedRowSetToJTable extends JFrame{

    DefaultTableModel dtmEjemplo;
    JTable tblEjemplo;
    JScrollPane scpEjemplo;

    public Ejm14_CachedRowSetToJTable()
    {

        tblEjemplo = new JTable();
        scpEjemplo= new JScrollPane();

        //Llenamos el modelo
        dtmEjemplo = new DefaultTableModel(null,getColumnas());

        //Conectar a la Base de datos
        Ejm12_1_ConectarPostgreSQL cnndb = new Ejm12_1_ConectarPostgreSQL();
        CachedRowSet crs = cnndb.Function("SELECT deptno, dname, loc FROM dept");

        //Pasar el CachedRowSet(crs) al JTable(tblEjemplo)
        CachedRowSetToJTable(crs,dtmEjemplo,tblEjemplo);

        scpEjemplo.add(tblEjemplo);
        this.add(scpEjemplo);
        this.setSize(500, 200);

        scpEjemplo.setViewportView(tblEjemplo);

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    }

    //Encabezados de la tabla
    private String[] getColumnas()
    {
          String columna[]=new String[]{"Columna1","Columna2","Columna3"};
          return columna;
    }

    private void CachedRowSetToJTable(CachedRowSet crs, DefaultTableModel modelo,JTable tbl)
    {

        try
        {
                ResultSetMetaData rsmd = crs.getMetaData();
                int numCols = rsmd.getColumnCount();

                modelo.setRowCount(0);

                Object []datos = new Object[numCols];

                while (crs.next())
                {
                    for (int i=0;i<numCols;i++)
                    {
                            datos[i]=crs.getObject(i+1);
                    }

                    modelo.addRow(datos);
                }
                tbl.setModel(modelo);
                crs.close();

        }
        catch(Exception e)
        {
                System.out.println(e.getMessage());
        }
    }

    public static void main(String args[]) {
        Ejm14_CachedRowSetToJTable obj1 = new Ejm14_CachedRowSetToJTable();
        obj1.setVisible(true);
    }

}

Código Java – Llenar un JTable desde una consulta a Base de Datos


Este es el Ejemplo #13 del Topic: Programación Gráfica en Java.

Después de haber aprendido a establecer la conexión a diferentes motores de base de datos mediante JDBC, el siguiente paso es realizar las consultas y mostrarlas. Para el ejemplo hago uso de un JTable para mostrar los datos provenientes de las consultas y para efectos didácticos he preferido usar PostgreSQL, aunque usted puede hacer uso del motor de base de datos que prefiera como cualquiera de las clases implementadas en el topic: Código Java – Establecer Conexión a Base de Datos con JDBC, que deberán ser incluidas en su proyecto, lo único que debería hacer es cambiar las instancias a las clases correspondientes como se muestra en las lineas siguientes,todo lo demás se mantiene. Observar que para este ejemplo he construido un JTable con solo 3 columnas, por ello limitarse a una consulta que retorne 3 columnas o modificar el código respectivo para ampliarlo:

Conexión a PostgreSQL:

...
        Ejm12_1_ConectarPostgreSQL cnndb = new Ejm12_1_ConectarPostgreSQL();
        CachedRowSet crs = cnndb.Function("SELECT deptno, dname, loc FROM dept")
...

Conexión a MySQL:

...
        Ejm12_2_ConectarMySQL cnndb = new Ejm12_2_ConectarMySQL();
        CachedRowSet crs = cnndb.Function("SELECT Host, User, Password FROM user");
...

Código de Ejemplo:

package beastieux.gui;

import javax.sql.rowset.CachedRowSet;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author beastieux
 */
public class Ejm13_LlenarJTableDesdeDataBase extends JFrame{

    DefaultTableModel dtmEjemplo;
    JTable tblEjemplo;
    JScrollPane scpEjemplo;
    public Ejm13_LlenarJTableDesdeDataBase()
    {

        tblEjemplo = new JTable();
        scpEjemplo= new JScrollPane();

        //Llenamos el modelo
        dtmEjemplo = new DefaultTableModel(null,getColumnas());

        setFilas();

        tblEjemplo.setModel(dtmEjemplo);
        scpEjemplo.add(tblEjemplo);
        this.add(scpEjemplo);
        this.setSize(500, 200);

        scpEjemplo.setViewportView(tblEjemplo);

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    }

    //Encabezados de la tabla
    private String[] getColumnas()
    {
          String columna[]=new String[]{"Columna1","Columna2","Columna3"};
          return columna;
    }

    private void setFilas()
    {
        //Conectar a PostgreSQL\\
        Ejm12_1_ConectarPostgreSQL cnndb = new Ejm12_1_ConectarPostgreSQL();
        CachedRowSet crs = cnndb.Function("SELECT deptno, dname, loc FROM dept");

        Object datos[]=new Object[3]; //Numero de columnas de la tabla

        try {
            while (crs.next()) {
                for (int i = 0; i < 3; i++) {
                        datos[i] = crs.getObject(i + 1);
                }
                dtmEjemplo.addRow(datos);
            }

            crs.close();
        } catch (Exception e) {
        }
    }

    public static void main(String args[]) {
        Ejm13_LlenarJTableDesdeDataBase obj1 = new Ejm13_LlenarJTableDesdeDataBase();
        obj1.setVisible(true);
    }

}

Código Java – Conexión a Base de Datos MySQL


Este es el Ejemplo #12.2 del Topic: Programación Gráfica en Java, que viene a formar parte del Topic #12 Código Java – Establecer Conexión a Base de Datos con JDBC

Como he explicado en el Topic #12, para realizar las conexiones necesitaremos los drivers respectivos, de acuerdo al motor de base de datos al cual deseemos conectarnos. En este ejemplo estableceremos una conexión con MySQL, para el cual es necesario contar con la respectiva librería como la que se muestra a continuación:

MySQL JDBC Driver - mysql-conector-java-5.1.3-bin.jar

Ustedes deberán conseguir la librería de acuerdo a la versión de MySQL al cual deseen conectarse y establecer los parámetros de conexión como se muestra en el código siguiente:

package beastieux.gui;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.sql.rowset.CachedRowSet;
import com.sun.rowset.CachedRowSetImpl;
/**
 *
 * @author beastieux
 */
public class Ejm12_2_ConectarMySQL {

    public CachedRowSet Function(String sql)
    {

            try
            {
                    Class.forName("org.gjt.mm.mysql.Driver");

                    String url = "jdbc:mysql://127.0.0.1:3306/mysql";
                    Connection con = DriverManager.getConnection(url, "usuario","contraseña");
                    Statement s = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                                      ResultSet.CONCUR_READ_ONLY);

                    ResultSet rs= s.executeQuery(sql);

                    CachedRowSet crs = new CachedRowSetImpl();
                    crs.populate(rs);

                    rs.close();
                    s.close();
                    con.close();

                    return crs;

            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }

            return null;
    }

    public void StoreProcedure(String sql)
    {

            try
            {
                    Class.forName("org.gjt.mm.mysql.Driver");

                    String url = "jdbc:mysql://127.0.0.1:3306/mysql";
                    Connection con = DriverManager.getConnection(url, "usuario","contraseña");
                    Statement s = con.createStatement();

                    s.execute(sql);

                    s.close();
                    con.close();

            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }
    }
}

Código Java – Conexión a Base de Datos PostgreSQL


Este es el Ejemplo #12.1 del Topic: Programación Gráfica en Java, que viene a formar parte del Topic #12 Código Java – Establecer Conexión a Base de Datos con JDBC

Como he explicado en el Topic #12, para realizar las conexiones necesitaremos los drivers respectivos, de acuerdo al motor de base de datos al cual deseemos conectarnos. En este ejemplo estableceremos una conexión con PostgreSQL 8.3, para el cual es necesario contar con la respectiva librería como la que se muestra a continuación:

postgresql-8.3-603.jdbc3.jar

Ustedes deberán conseguir la librería de acuerdo a la versión de PostgreSQL al cual deseen conectarse y establecer los parámetros de conexión como se muestra en el código siguiente:


package beastieux.gui;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import javax.sql.rowset.CachedRowSet;
import com.sun.rowset.CachedRowSetImpl;
/**
 *
 * @author beastieux
 */
public class Ejm12_1_ConectarPostgreSQL {

    public CachedRowSet Function(String sql)
    {
            try
            {
                    Class.forName("org.postgresql.Driver");

                    String url = "jdbc:postgresql://127.0.0.1:5432/postgres";
                    Connection con = DriverManager.getConnection(url, "usuario","contraseña");
                    Statement s = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                                      ResultSet.CONCUR_READ_ONLY);

                    ResultSet rs= s.executeQuery(sql);

                    CachedRowSet crs = new CachedRowSetImpl();
                    crs.populate(rs);

                    rs.close();
                    s.close();
                    con.close();

                    return crs;

            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }

            return null;
    }

    public void StoreProcedure(String sql)
    {

            try
            {
                    Class.forName("org.postgresql.Driver");

                    String url = "jdbc:postgresql://127.0.0.1:5432/postgres";
                    Connection con = DriverManager.getConnection(url, "usuario","contraseña");
                    Statement s = con.createStatement();

                    s.execute(sql);

                    s.close();
                    con.close();

            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }
    }
}

Código Java – Establecer Conexión a Base de Datos con JDBC


Por fin he preparado el Ejemplo #12 del Topic: Programación Gráfica en Java, en el cual explicaré sobre cómo conectarnos a una base de datos cualquiera desde Java, manteniendo una misma estructura.

Para realizar la conexión a base de datos desde java necesitamos hacer uso de JDBC. Las bases de datos que deseemos conectar deberán proveernos el driver JDBC en un empaquetado JAR para añadirlo a las librerías del proyecto.

Deberemos conseguir la librería de acuerdo a la versión de la Base de Datos al cual deseemos conectarnos. Es posible que su IDE reconozca la existencia del driver si la base de datos ha sido instalada en el mismo ordenador junto con sus librerías, solo haría falta añadirlo a la lista de librerías que se usarán en el proyecto, por ejemplo en NetBeans se podría ir al directorio Libraries del Proyecto, hacer clic derecho sobre el y elegir Add Library y en la lista podría encontrase la que necesitemos, o si queremos agregarla manualmente Add JAR/Folder y seleccionar desde la dirección donde lo tenemos almacenado.

Add Library:

Add JAR/Folder:

Una vez agregada la librería, vamos a realizar el código de conexión, el cual nos debe presentar una clase con 2 métodos que a mi parecer no deberían faltar. Debería existir una función(Las funciones retornan datos) que nos retorne un CachedRowSet que es algo similar al ResultSet que no podemos retornar mientras el Statement esté sin cerrar, pero es obvio que por seguridad deberemos tener todas las conexiones cerradas, por eso no retornamos directamente el ResultSet y hacerlo sin cerrar las conexiones sería de muy mala práctica. En cambio, el CachedRowSet almacena todos los registros y podemos manipularla con las conexiones cerradas, cosa que no podemos hacer con los ResultSets, ya que éstos necesitan al Statement Abierto, y el Statement a su vez necesita la conexión abierta. Por otro lado deberíamos tener un procedimiento(No retorna ningún dato), no retorna nada ya que se encargará de realizar operaciones unidireccionales.

En conclusión, usamos la Función cuando usemos Sentencias DML SELECT incluyendo las Funciones y usar el Procedimiento cuando usemos INSERT, DELETE O UPDATE, incluyendo los StoreProcedures(Procedimientos Almacenados); aunque podemos conocer algunas bases de datos que permitan retornar datos desde StoreProcedures, lo ideal seria hacerlo desde funciones, manteniendo cada uno para su propósito. Del mismo modo, habrán podido darse cuenta que ambos métodos reciben una variable String como parámetro, ésta es nada menos que la Sentencia DML que deseamos ejecutar.

package beastieux.gui;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import javax.sql.rowset.CachedRowSet;
import com.sun.rowset.CachedRowSetImpl;
/**
 *
 * @author beastieux
 */
public class Ejm12_ConectarDataBase {

    public CachedRowSet Function(String sql)
    {
            try
            {
                    Class.forName("Driver");

                    String url = "jdbc:motor:servidor:puerto/basededatos";
                    Connection con = DriverManager.getConnection(url, "usuario","contraseña");
                    Statement s = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                                      ResultSet.CONCUR_READ_ONLY);

                    ResultSet rs= s.executeQuery(sql);

                    CachedRowSet crs = new CachedRowSetImpl();
                    crs.populate(rs);

                    rs.close();
                    s.close();
                    con.close();

                    return crs;

            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }

            return null;
    }

    public void StoreProcedure(String sql)
    {

            try
            {
                    Class.forName("Driver");

                    String url = "jdbc:motor:servidor:puerto/basededatos";
                    Connection con = DriverManager.getConnection(url, "usuario","contraseña");
                    Statement s = con.createStatement();

                    s.execute(sql);

                    s.close();
                    con.close();

            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }
    }
}

Como habrán podido apreciar en el código, el manejo de excepciones es relativamente sencilla, lo ideal sería especificar las excepciones por cada conexion, statement y resultset para de esa manera asegurarnos que permanezcan cerradas al finalizar la ejecución o aun cuando existieran errores; de igual manera sería muy útil obligar a cerrar las conexiones desde dentro de una clausula finally anexada al try – catch.

Por último la url de conexión “jdbc:motor:servidor:puerto/basededatos”, variará a continuación de jdbc, según el motor de base de datos al que deseemos conectarnos (PostgreSQL, MySQL, Oracle, Derby, etc) , la dirección IP del servidor, el puerto y finalmente el nombre de la base de datos al que queramos acceder.

En los próximos posts se presentará las conexiones a las diversas bases de datos y la explicación de como usar la clase creada.

Código Java – Conexión a Base de Datos PostgreSQL
Código Java – Conexión a Base de Datos MySQL
Código Java – Conexión a Base de Datos Apache Derby (Embebida y Cliente – Servidor)

A %d blogueros les gusta esto: