miércoles, 31 de marzo de 2010

Novedades en el paquete javax.swing de java SE 6

Hola a todos de nuevo, es un placer para mí estar aquí de nuevo compartiendo acerca de las novedades que trae java 6. Ahora le toca el turno al paquete javax.swing.

Observando las clases directamente de la página de Sun Microsystem, tanto del JAVA SE 5 como del JAVA SE 6, puede verse que en este último fueron agregadas las siguientes clases:

DefaultRowSorter
DefaultRowSorter.Model
DefaultRowSorter.Wrapper

GroupLayout

JList.DropLocation
JTable.DropLocation
JTree.DropLocation

LayoutStyle

RowFilter
RowFilter.Entry
RowSorter
RowSorter.SortKey

SwingWorker

Para este artículo se explicará los fundamentos básicos para realizar interfaces gráficas con GroupLayout. Sin mas que esperar, empecemos:

Este administrador de disposición trabaja con eje vertical y horizontal separadamente. Cuando se ha definido la colocación de los componentes en uno de los ejes ya está la mitad del problema resuelto, se pasa luego a definir la colocación del mismo componente en el otro eje, si, esto quiere decir que cada componente debe estar presente tanto en el eje vertical como en el horizontal de no ser así el GroupLayout lanza una exception.

Este administrador de esquema puede organizar los componentes o secciones en forma secuencial o paralela: Secuencial significa uno al lado para el eje horizontal y uno arriba del otro para el vertical.

El paralelo significa colocar en una misma línea (vertical u horizontal) los elementos que necesite. Tanto si utiliza Secuencial como Paralelo se pueden agregar a ellos tanto componentes como nuevos grupos.

Veamos un ejemplo para aclarar las dudas que se hayan ir podido planteando hasta ahora:

Supongamos que queremos crear la siguiente interfaz gráfica:



Espero explicarme con estas dos imágenes a continuación; primero veamos la distribución horizontal:



Las líneas oscuras (negras) superiores reflejan la distribución mas externa de ese panel, como puede verse existe una disposición secuencial, de izquierda a derecha, por lo tanto si creamos primero en GroupLayout myLayout, lo primero que debemos hacer es definir esta distribución, de la siguiente manera:


myLayout.setHorizontalGroup( myLayout.createSequentialGroup());


Luego, se va definiendo o agregando el código de las secciones mas internas, por ejemplo, la primera sección contiene una distribución paralela de dos componentes, primero codificamos la sección paralela:


myLayout.setHorizontalGroup( myLayout.createSequentialGroup()
  .addGroup( myLayout.createParallelGroup())
);



Luego los componentes:


myLayout.setHorizontalGroup( myLayout.createSequentialGroup()
  .addGroup( myLayout.createParallelGroup()
    .addComponent(lblNombre)
    .addComponent(lblEmail)
)
);



Como hemos dicho, cada sección puede contener tanto componentes como nuevos grupos, esto quiere decir que pueden haber grupos anidados, es decir, grupos dentro de otros grupos.
Un ejemplo de esto es cuando queremos colocar los JCheckBox. La sección horizontal media contiene un nuevo grupo, tal como lo muestra el código que sigue:



.addGroup(myLayout.createParallelGroup()
  .addComponent(txtNombre)
  .addComponent(txtEmail)
  .addGroup(myLayout.createSequentialGroup()
    .addGroup(myLayout.createParallelGroup()
      .addComponent(chkActualizacion)
//etc... mas adelante está el código completo esto es sólo para explicación
)
);



Pasemos ahora a definir nuestra distribución vertical:



En este caso puede verse también una distribución secuencial (de arriba hasta abajo) y en este caso un poco más sencillo debido a que cada sección contiene directamente los componentes, es decir, no hay subdivisiones o grupos anidados.

El código fuente final de el GroupLayoutExample queda de la siguiente manera:

GeSHi © 2004-2007 Nigel McNie, 2007-2009 Benny Baumann, 2008-2009 Milian Wolff
  1. package ejemploblog;

  2.  

  3. import javax.swing.*;

  4.  

  5. public class GroupLayoutExample extends JPanel{
  6.  
  7.         JLabel lblNombre = new JLabel("Nombre: ");
  8.         JLabel lblEmail  = new JLabel("email: ");
  9.         JTextField txtNombre = new JTextField(20);
  10.         JTextField txtEmail = new JTextField(20);
  11.         JCheckBox chkActualizacion = new JCheckBox("Actualizaciones");
  12.         JCheckBox chkComentarios = new JCheckBox("Comentarios");
  13.         JCheckBox chkCodigo = new JCheckBox("Codigo Fuente");
  14.         JCheckBox chkInfo = new JCheckBox("Informacion");
  15.         JButton btnAceptar = new JButton("Aceptar");
  16.         JButton btnOmitir = new JButton("Omitir");
  17.         public GroupLayoutExample(){
  18.                 GroupLayout myLayout = new GroupLayout(this);
  19.                 setLayout(myLayout);

  20.                 //Crear espacio entre componentes
  21.                 myLayout.setAutoCreateGaps(true);
  22.                 //Crear espacio entre componente contenedor
  23.                 myLayout.setAutoCreateContainerGaps(true);
  24.                
  25.                 myLayout.setHorizontalGroup( myLayout.createSequentialGroup()
  26.                             .addGroup(myLayout.createParallelGroup()
  27.                                         .addComponent(lblNombre)
  28.                                         .addComponent(lblEmail)
  29.                             )
  30.                             .addGroup(myLayout.createParallelGroup()
  31.                                         .addComponent(txtNombre)
  32.                                         .addComponent(txtEmail)
  33.                                         .addGroup(myLayout.createSequentialGroup()
  34.                                                         .addGroup(myLayout.createParallelGroup()
  35.                                                                                 .addComponent(chkActualizacion)
  36.                                                                                 .addComponent(chkComentarios)
  37.                                                                 )
  38.                                                         .addGroup(myLayout.createParallelGroup()
  39.                                                                         .addComponent(chkCodigo)
  40.                                                                         .addComponent(chkInfo)
  41.                                                         )
  42.                                         )
  43.                             )
  44.                             .addGroup(myLayout.createParallelGroup()
  45.                                         .addComponent(btnAceptar)
  46.                                         .addComponent(btnOmitir)
  47.                             )

  48.                         );
  49.                 myLayout.setVerticalGroup(myLayout.createSequentialGroup()
  50.                         .addGroup(myLayout.createParallelGroup()
  51.                                         .addComponent(lblNombre)
  52.                                         .addComponent(txtNombre)
  53.                                         .addComponent(btnAceptar)
  54.                         )
  55.                         .addGroup(myLayout.createParallelGroup()
  56.                                         .addComponent(lblEmail)
  57.                                         .addComponent(txtEmail)
  58.                                         .addComponent(btnOmitir)
  59.                         )
  60.                         .addGroup(myLayout.createParallelGroup()
  61.                                         .addComponent(chkActualizacion)
  62.                                         .addComponent(chkCodigo)
  63.                         )
  64.                         .addGroup(myLayout.createParallelGroup()
  65.                                         .addComponent(chkComentarios)
  66.                                         .addComponent(chkInfo)
  67.                         )
  68.                 );
  69.         }      

  70. }

  71.  

Parsed in 0.176 seconds at 12.76 KB/s


Para crear la clase ejecutable (main), sería:

GeSHi © 2004-2007 Nigel McNie, 2007-2009 Benny Baumann, 2008-2009 Milian Wolff
  1. package ejemploblog;
  2.  
  3. import java.awt.BorderLayout;
  4.  

  5. import javax.swing.JFrame;
  6.  
  7. public class Aplicacion {
  8.  
  9.        
  10.         public static void main(String[] args) {
  11.                 JFrame marco = new JFrame("Suscripcion Acerca de Java");
  12.                 marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13.                 marco.getContentPane().add(new GroupLayoutExample(), BorderLayout.CENTER);
  14.                 marco.pack();
  15.                 marco.setVisible(true);
  16.  
  17.         }
  18. }

Parsed in 0.109 seconds at 3.64 KB/s


Bueno, esto es todo por ahora, espero haberme explicado en este artículo, si quieren un Tutorial completo (en inglés) sobre GroupLayout, busca en esta dirección:

How to Use GroupLayout

Donde hay inclusive otro ejemplo.

Hasta la próxima!

viernes, 19 de marzo de 2010

Java 6. Derby, la base de datos incluida en jdk 6

   Saludos compañeros y gracias por estar de nuevo aquí aprendiendo juntos un poco más sobre lo que es la tecnología Java en su última version de Java SE 6.

   Ahora le toca el turno a Derby: Base de datos relacional y transaccional que viene incluido por defecto en el JDK 6.0, más específicamente lo puede encontrar en la ruta de java. En windows: C:\Archivos de Programa\Java\jdk1.6.0\db, o en general en la carpera db donde se encuentra la instalación de java SE 6.

   Para hablar un poco de dónde viene Derby, esta se inicia como CloudSpace: una base de datos relacional creada por Informix, compañía que fue adquirida en 2001 por IBM. en 2004 IBM decide convertir a CloudSpace en software libre cambiando su nombre a Derby.
La página principal de Derby es: http://db.apache.org/derby/.

   Las ventajas que promete Derby son sus mínimas necesidades de configuración y administración y el pequeño espacio que ocupa en disco. Otra ventaja es que Derby soporta el almacenamiento de una base de datos archivada en un archivo JAR, lo que lo hace fácil de incluirlo y distribuirlo en nuestra aplicación.

   Visto esto, empecemos a ver cómo incluir esta base de datos en nuestra aplicación Java.

   Objetando un poco: Aunque se dice que Derby viene incluido con el JDK 6.0, en las últimas instalaciones que he realizado no ha sido instalado por defecto, por lo tanto lo descargué directamente de db-derby-10.5.3.0-bin.zip.

   Una vez descargado se descomprime en la carpeta que se desee (supongamos C:\derby). Ahora se agrega al PATH (variable de entorno) la ruta interna bin (es decir C:\derby\bin). En esta carpeta se encuentran dos archivos esenciales: ij.bat y startNetworkServer.bat. Abrimos una consola y ejecutamos primero el startNetworkServer.bat (en la ruta C:\derby\bin) con esto se levantará el servidor de base de datos Derby.

   Una vez hecho esto hay que dirigirse en una consola nueva a la carpeta de nuestro proyecto (preferiblemente) para crear nuestra base de datos nueva.
Una vez ubicado en la ruta de nuestro proyecto java se escribe ij.bat, se iniciará la aplicación ij que es la herramienta para conectarse, crear y manipular base de datos Derby.
NOTA IMPORTANTE: La creación de una base de datos Derby agrega una carpeta con el nombre de la base de datos al sistema en la ruta donde fue ejecutada la aplicación ij, por ello es recomendable dirigirse a la carpeta donde se encuentra nuestro proyecto y ejecutar allí esta herramienta.


C:\RutaProyecto\ij.bat
Version ij 10.5
ij>


   Ahora a la linea ij> se debe agregar algo como:

ij> connect 'jdbc:derby:NombreBD;create=true';



NOTA: No olvide colocar el punto y coma al final de cada sentencia derby, ya que esto indica que finaliza la misma, si no lo hace no se ejecuta la sentencia escrita.

   Con esto se crea una base de datos Derby de nombre NombreBD en la ruta donde se ejecutó el ij.bat. Podemos ahora crear una tabla, insertar registros y seleccionarlos:


ij> CREATE TABLE persona(id integer, nombre varchar(15), apellido varchar(15), edad integer);
0 filas insertadas/actualizadas/suprimidas
ij>INSERT INTO persona VALUES(1, 'Rafael', 'Romero', 31),(2, 'Orlando', 'Gracia', 42),(3, 'Yessica', 'Alba', 35);
3 filas insertadas/actualizadas/suprimidas
ij> SELECT * FROM persona;
//Se muestran los datos ingresados
3 filas seleccionadas


   Por defecto la ejecución automática está activada (autocommit ON), se puede controlar escribiendo en ij> autocommit ON; o autocommit OFF;

   Para salir de la herramienta ij se escribe exit;

   Una vez visto esto veamos como podemos enlazar esta base de datos a nuestra aplicación.
  1. import java.sql.*;
  2.  
  3. public class Derbiando {
  4.  
  5.         public static void main(String[] args) {
  6.                 Derbiando dbDerby = new Derbiando();
  7.                 dbDerby.mostrarDatos();
  8.         }
  9.  
  10.         public void mostrarDatos(){
  11.                 try{
  12.                         String driver = "org.apache.derby.jdbc.EmbeddedDriver";
  13.                         Class.forName(driver).newInstance();
  14.                         Connection conn = DriverManager.getConnection("jdbc:derby:C:\\RutaProyecto\\NombreBD");
  15.                         Statement s = conn.createStatement();
  16.                         ResultSet rs = s.executeQuery("SELECT * FROM persona");
  17.                         while(rs.next()){
  18.                                 System.out.println("id: "+rs.getInt(1));
  19.                                 System.out.println("nombre: "+rs.getString(2));
  20.                                 System.out.println("apellido: "+rs.getString(3));
  21.                                 System.out.println("edad: "+rs.getInt(4));
  22.                                 System.out.println();
  23.                         }
  24.                         rs.close();
  25.                         s.close();
  26.                         conn.close();
  27.                 }catch (Exception e) {
  28.                         e.printStackTrace();
  29.                 }
  30.                        
  31.                
  32.         }
  33. }



Salida Generada:
id: 1
nombre: Rafael
apellido: Romero
edad: 31

id: 2
nombre: Orlando
apellido: Gracia
edad: 42

id: 3
nombre: Yessica
apellido: Alba
edad: 35