The::Beastieux

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

Archivos por Etiqueta: Programación

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";

Métodos de Ordenamiento Hechos en Python


Los primeros posts que realizo sobre Python estarán dedicados a los métodos de ordenamiento. Hasta el momento la codificación en python me ha sorprendido mucho porque es muy sencilla, limpia, no necesitas escribir mucho a comparación de otros lenguajes de programación. Si te gusta la programación te aseguro que python te va a encantar. Aquí les dejos los métodos de ordenamiento escritos en Python:

Método Burbuja: Ordenamiento Burbuja.py
Método Shell: Ordenamiento Shell.py
Método QuickSort: Ordenamiento por método QuickSort.py
Método Inserción Directa: Ordenamiento por inserción Directa.py
Método Inserción Binaria: Ordenamiento por inserción Binaria.py
Método Selección: Ordenamiento método Selección.py
Método HeapSort: Ordenamiento método HeapSort.py

Código Python – Ordenamiento por Selección


El siguiente post pertenece al topic: Métodos de Ordenamiento codificados en Python.

El código realiza un Ordenamiento de datos numéricos haciendo uso del Método de Selección:

def selectionsort(lista,tam):
    for i in range(0,tam-1):
        min=i
        for j in range(i+1,tam):
            if lista[min] > lista[j]:
                min=j
        aux=lista[min]
        lista[min]=lista[i]
        lista[i]=aux

def imprimeLista(lista,tam):
    for i in range(0,tam):
        print lista[i]

def leeLista():
    lista=[]
    cn=int(raw_input("Cantidad de numeros a ingresar: "))

    for i in range(0,cn):
        lista.append(int(raw_input("Ingrese numero %d : " % i)))
    return lista

A=leeLista()
selectionsort(A,len(A))
imprimeLista(A,len(A))

Código Python – Ordenamiento por Inserción Binaria


El siguiente post pertenece al topic: Métodos de Ordenamiento codificados en Python.

El código realiza un Ordenamiento de datos numéricos haciendo uso del Método de Inserción Binaria:

def insercionBinaria(lista,tam):
    for i in range(1,tam):
        aux=lista[i]
        izq=0
        der=i-1
        while izq<=der:
                m=(izq+der)/2
                if aux < lista[m]:
                        der=m-1
                else:
                        izq=m+1

        j=i-1
        while j>=izq:
                lista[j+1]=lista[j]
                j=j-1
        lista[izq]=aux

def imprimeLista(lista,tam):
    for i in range(0,tam):
        print lista[i]

def leeLista():
    lista=[]
    cn=int(raw_input("Cantidad de numeros a ingresar: "))

    for i in range(0,cn):
        lista.append(int(raw_input("Ingrese numero %d : " % i)))
    return lista

A=leeLista()
insercionBinaria(A,len(A))
imprimeLista(A,len(A))

Código Python – Ordenamiento Shell


El siguiente post pertenece al topic: Métodos de Ordenamiento codificados en Python.

El código realiza un Ordenamiento de datos numéricos haciendo uso del Método Shell:

def ordenShell(lista,tam):
    inc=1
    for inc in range(1,tam,inc*3+1):
        while inc>0:
            for i in range(inc,tam):
                j=i
                temp=lista[i]
                while j>=inc and lista[j-inc]>temp:
                    lista[j]=lista[j-inc]
                    j=j-inc
                lista[j]=temp
            inc=inc/2

def imprimeLista(lista,tam):
    for i in range(0,tam):
        print lista[i]

def leeLista():
    lista=[]
    cn=int(raw_input("Cantidad de numeros a ingresar: "))

    for i in range(0,cn):
        lista.append(int(raw_input("Ingrese numero %d : " % i)))
    return lista

Código Python – Ordenamiento por Inserción Directa


El siguiente post pertenece al topic: Métodos de Ordenamiento codificados en Python.

El código realiza un Ordenamiento de datos numéricos haciendo uso del Método de Inserción Directa:

def insercionDirecta(lista,tam):
    for i in range(1,tam):
        v=lista[i]
        j=i-1
        while j >= 0 and lista[j] > v:
            lista[j+1] = lista[j]
            j=j-1
        lista[j+1]=v

def imprimeLista(lista,tam):
    for i in range(0,tam):
        print lista[i]

def leeLista():
    lista=[]
    cn=int(raw_input("Cantidad de numeros a ingresar: "))

    for i in range(0,cn):
        lista.append(int(raw_input("Ingrese numero %d : " % i)))
    return lista

A=leeLista()
insercionDirecta(A,len(A))
imprimeLista(A,len(A))

Código Python – Ordenamiento Heapsort


El siguiente post pertenece al topic: Métodos de Ordenamiento codificados en Python.

El código realiza un Ordenamiento de datos numéricos haciendo uso del Método Heapsort:

def heapsort(lista,tam):
    for k in range(tam-1,-1,-1):
        for i in range(0,k):
            item=lista[i]
            j=(i+1)/2
            while j>=0 and lista[j]<item:
                lista[i]=lista[j]
                i=j
                j=j/2
            lista[i]=item
        temp=lista[0];
	lista[0]=lista[k];
	lista[k]=temp;

def imprimeLista(lista,tam):
    for i in range(0,tam):
        print lista[i]

def leeLista():
    lista=[]
    cn=int(raw_input("Cantidad de numeros a ingresar: "))

    for i in range(0,cn):
        lista.append(int(raw_input("Ingrese numero %d : " % i)))
    return lista

A=leeLista()
heapsort(A,len(A))
imprimeLista(A,len(A))
A %d blogueros les gusta esto: