POV-Ray: Formas basicas (sphere, box, cone, cylinder, plane, torus)

Ilustracion de la sintaxis de las formas basicas de POV-Ray (sphere, box, cone, cylinder, plane, torus). Como actualmente llevo la materia de Graficacion y en nuestro grupo vamos a usar POV-Ray para modelar todo lo aprendido pues en esta casion quiero mostrar la sintaxis basica de las 6 formas mas basicas de POV-Ray; la esfera, el cubo, el cono, el cilindro, los 3 planos X,Y,Z y el toroide. Tambien muestro un ejemplo de codigo y doy por hecho que ya te has descargado e instalado el software, sino es asi Aqui puedes empezar http://www.povray.org/download/.

Una introduccion rapida: Los programas como POV-Ray (trazadores de rayos) son programas que permiten definir escenas con una camara simulada (camara sintetica), figuras geometricas y fuentes de luz (algo asi como focos de luz del color que nosotros deseemos) para hacer todo esto se utiliza un lenguaje de script para definir toda la escena. Al indicarle al programa que interprete (renderize) el mismo software dibuja y calcula donde inciden los rayos de luz sobre los objetos (ya no digo mas porque se pierde el objetivo de esta entrada de blog). Yo tengo instalada la version 3.6.1 de POV, como se muestra en la siguiente imagen:

Mi version de povray

Mi version de povray

Voi a ir mostrando primeramente la sintaxis de cada figura y a continuacion un ejemplo de codigo en POV-Ray seguido de la imagen que se genera, por pasos, empezamosss…

1.- OBJETO ESFERA (sphere)
Esta figura basicamente se define especificando las coordenadas del centro de la esfera y el tamaño del radio como se observa en la siguiente imagen:

Sintaxis del objeto Esfera

Sintaxis del objeto Esfera

Ejemplo de codigo fuente en POV-Ray:

  1. /*
  2. Descripcion: Posicion de la camara, dibujo de una esfera y creacion de una fuente de luz
  3. Author: Gonzalo Silverio
  4. Archivo: practica1.pov
  5. Tutorial PovRay: 3.1.6 Definiendo una fuente de luz
  6. */
  7. #include «colors.inc»
  8. //Definicion de la camara sintetica
  9. camera {
  10. location <5,2,4>
  11. look_at <0,1,2>
  12. }
  13. // Definicion del objeto esfera
  14. sphere {
  15. <0,1,2>,1.5
  16. texture{
  17. // OTRAs FORMAS DE DEFINIR EL COLOR
  18. //pigment {color Yellow}
  19. //pigment {color red 0.5 green 0.8 blue 0.8}
  20. //pigment { color rgb<0.5,0.8,0.8> }
  21. pigment { rgb<0, 0, 1> }
  22. }
  23. }
  24. //fuente de luz
  25. light_source {<2,4,4> color White }

En el codigo anterior se puede onbservar que en la linea 15 se a definido una esfera en las coordenadas 0 en X, 1 en Y y 2 en Z. La Imagen de la Escena que se genera es esta:

Renderizado de un objeto esfera

Renderizado de un objeto esfera

2.- OBJETO CAJA (box)
Una caja es una especie de cubo. Para definir un box (caja) se hace especificando dos coordenadas; la primera coordenada es la de una esquina de la caja y la otra coordenada es la otra esquina opuesta a la primera, en la siguiente imagen e puesto dos ejemplos para que esto quede mas claro. Se puede utilizar cualquiera esquinas para definir la caja.

Sintaxis del objeto Caja

Sintaxis del objeto Caja

Ejemplo de codigo fuente en POV-Ray:

  1. /*
  2. Instituto Tecnologico de Zacatepec, Mor.
  3. Descripcion: Uso del objeto Box (caja)
  4. Author: Gonzalo Silverio
  5. Archivo: practica2.pov
  6. Tutorial PovRay: 3.2.1 Objeto Caja (Box)
  7. */
  8. #include «colors.inc»
  9. #include «stones.inc»
  10. //posicion de la camara sintetica
  11. camera {
  12. location <8,8,8>
  13. look_at <2,2,2>
  14. }
  15. //Definicion de un objeto caja
  16. box {
  17. <0,0,0>,
  18. <4,4,4>
  19. texture{
  20. T_Stone25
  21. //Escalar la textura
  22. scale 19
  23. }
  24. //rotate <0,20,0> //Rotar 20 grados respecto a eje Y
  25. //El sentido de los giros se hacen usando la regla de la mano izquierda
  26. rotate y*-15 //-15 grados en y
  27. rotate z*30 //30 grados en z
  28. }
  29. // fuente de luz
  30. light_source {
  31. <6,6,8> color rgb <0.5,1,0.8>
  32. }

Como se ve en el codigo de POV-Ray he definido una caja con una esquina en el origen del sistema de coordenadas 3D (0,0,0, linea 17) y la otra esquina con 4 unidades en X, 4 en Y, y 4 unidades positivas en Z (linea 18). Ademas, le e asigando una textura estilo tipo roca (stone, linea 20), dicha textura la e escalado 19 unidades (linea 22) y por tambien e rotado la caja en Y y en Z (linea 26 y 27). La Imagen de la Escena que se genera es esta:

Renderizado de un objeto Caja

Renderizado de un objeto Caja

3.- OBJETO CONO (cone)
Un objeto cono se define en POV-Ray especificando las coordenadas del centro de sus dos extremos y sus respectivos radios como lo e indicado en la siguiente imagen. La palabra ‘open’ en gris se puede omitir; si esta palabra no esta el cono TIENE tapas, si esta palabra se pone entonces el cono NO TIENE tapas en sus extremos (esta abierto).

Sintaxis del objeto Cono

v

Si deseamos que alguno de los extremos termine en pico, entonces en uno de sus extremos indicamos un R=0 depende de donde deseamos el pico; como se observa en la siguiente imagen:

Sintaxis del objeto Cono, con extremos en pico

Sintaxis del objeto Cono, con extremos en pico

Ejemplo de codigo fuente en POV-Ray con un cono al cual se le quitan las tapas (open):

  1. /*
  2. Instituto Tecnologico de Zacatepec, Mor.
  3. Descripcion: Uso del objeto cone (cono)
  4. Author: Gonzalo Silverio
  5. Archivo: practica3.pov
  6. Tutorial PovRay: 3.2.2 Objeto Cono
  7. */
  8. #include «colors.inc»
  9. #include «stones.inc»
  10. //Posicion de la camara sintetica
  11. camera {
  12. location <8,8,8>
  13. look_at <0,0,2>
  14. }
  15. // Definicion del objeto cono
  16. cone {
  17. <4,0,0>,1
  18. <4,5,3>,1.2
  19. open //quitar tapas (abierto)
  20. texture {
  21. pigment { color rgb <0.6,0.4,1> }
  22. }
  23. }
  24. //posicion de fuente de luz 1
  25. light_source {<4,5,6> color White }
  26. //otra fuente de luz 2
  27. light_source {<8,5,6> color White }

Como se observa en el codigo he definido un cono con extremo en las coordenadas 4 unidades en X, o en Y y 0 en Z; el tamaño del radio es de una unidad. El otro extremo esta igual 4 unidades en X, 5 unidades arriba en Y y -3 unidades en Z. Recordemos que la unidades positivas en X ‘entran’ en el plano 3D y las coordenas negativas ‘salen’ del plano; es por esto que el cono se ve como se estuviera inclinado hacia nosotros en el plano. En realidad tambien podemos definir un cilindro con el objeto cone; basta con definir el mismo radio en ambos extremos. La Imagen de la Escena que se genera es esta:

Renderizado de un objeto Cono

Renderizado de un objeto Cono

4.- OBJETO CILINDRO (cylinder)
La sintaxis del objeto cilindro es casi identica a la del objeto cono con la diferencia de que solamente se especifica un radio debido a que un cilindro tiene el mismo radio en ambos extremos (si fueran diferentes pasaria a ser un cono, jejejejj). A continuacion una imagen que aclara todo:

Sintaxis del objeto Cilindro

Sintaxis del objeto Cilindro

Nuevamente la palabra clave ‘open’ quita las tapas del cilindro.
Ejemplo de codigo fuente en POV-Ray que muestra un cilindro color gris:

  1. /*
  2. Instituto Tecnologico de Zacatepec, Mor.
  3. Descripcion: Uso del objeto cylinder (cilindro) para dibujar los ejes X,Y,Z
  4. Author: Gonzalo Silverio
  5. Archivo: practica4.pov
  6. Tutorial PovRay: 3.2.3 Objeto Cilindro
  7. */
  8. #include «colors.inc»
  9. //Posicion de la camara sintetica
  10. camera {
  11. location <10,10,10>
  12. look_at <0,5,0>
  13. }
  14. //Definicion del objeto cilindro
  15. cylinder {
  16. <6,0,3>,
  17. <5,4,3>,
  18. 0.5
  19. pigment { color rgb<1,1,1> }
  20. }
  21. //A CONTINUACION SE VAN A DIBUJAR LOS 3 EJES TRIDIMENSIONALES
  22. //Dibujar el eje X
  23. cylinder {
  24. <0,0,0>,
  25. <20,0,0>,
  26. 0.1
  27. pigment { color Green}
  28. }
  29. //Dibujar el eje Y
  30. cylinder {
  31. <0,0,0>,
  32. <0,20,0>,
  33. 0.1
  34. pigment { color Green }
  35. }
  36. //Dibujar el eje Z
  37. cylinder {
  38. <0,0,0>,
  39. <0,0,20>,
  40. 0.1
  41. pigment {color Green }
  42. }
  43. // fuente de luz
  44. light_source { <8,6,6> color White }

Como se observa en el codigo e puesto la camara sintetica 10 unidades lejos del origen y he definido 3 cilindros de 20 unidades de largo en cada eje y un radio muy pequeño. Si alejaramos la camara por ejemplo a 30 unidades lejos del origen se veria donde terminan los cilindros pero la e puesto cerca para que esto de la impresion de los ejes X,Y y Z. La Imagen de la Escena que se genera es esta:

Renderizado de un objeto Cilindro

Renderizado de un objeto Cilindro

5.- OBJETO PLANO (plane)
Un plano en POV-Ray yo lo veo como un piso o techo (plano y) o como una pared (plano X y Z). Como se observa en la siguiente imagen hay dos maneras de especificar un plano; uno es con la sintaxis de vectores < , , >; mas claro para definir el plano X se hace con el vector <1,0,0>, para definir el plano Y se hace con el vector <0,1,0> o para definir el plano Z se hace con el vector <0,0,1>. Para abreviar esto; los desarrolladores de POV-Ray crearon un identificador para cada vector de tal modo que hay 3 identificadores llamados x,y y z. Ademas de especificar el plano se debe especificar un desplazamiento del plano en sistema de coordenadas, para el caso del plano X el desplazamiento es hacia la derecha (+) o a la izquierda (-), para el caso del plano Y el desplamiento es hacia arriba (+) o hacia abajo (-) y por ultimo para el caso del plano Z el desplamiento es hacia adentro (+) o hacia afuera (-). Una imagen dice mas que 1000 palabras:

Sintaxis del objeto Plano

Sintaxis del objeto Plano

Ejemplo de codigo fuente en POV-Ray que muestra el plano Y (agredrezado):

  1. /*
  2. Instituto Tecnologico de Zacatepec, Mor.
  3. Descripcion: Uso del objeto plane (plano)
  4. Author: Gonzalo Silverio
  5. Archivo: practica5.pov
  6. Tutorial PovRay: 3.2.4 Objeto Plano
  7. */
  8. #include «colors.inc»
  9. //Posicion de la camara sintetica
  10. camera {
  11. location <12,12,12>
  12. look_at <0,0,0>
  13. }
  14. //Mostrar el plano de X
  15. /*
  16. plane {
  17. <1,0,0>,-1
  18. //x,-1 Otra forma de definir este plano
  19. pigment {
  20. //checker color Red, color Blue
  21. color White
  22. }
  23. }
  24. */
  25. //Mostrar el plano de Y
  26. plane {
  27. y,1
  28. //<0,1,0>,-1 Otra forma de definir este plano
  29. pigment {
  30. checker color Red, color Yellow
  31. }
  32. }
  33. //Mostrar el plano de Z
  34. /*
  35. plane {
  36. <0,0,1>,1
  37. //z,1 Otra forma de definir este plano
  38. pigment {
  39. checker color Red, color White
  40. }
  41. }
  42. */
  43. //A CONTINUACION SE VAN A DIBUJAR LOS 3 EJES TRIDIMENSIONALES
  44. //Dibujar el eje X
  45. cylinder {
  46. <0,0,0>
  47. <20,0,0>
  48. 0.1
  49. pigment { color Green }
  50. }
  51. //Dibujar el eje Y
  52. cylinder {
  53. <0,0,0>
  54. <0,20,0>
  55. 0.1
  56. texture
  57. {
  58. pigment { color Green }
  59. }
  60. }
  61. //Dibujar el eje Z
  62. cylinder {
  63. <0,0,0>
  64. <0,0,20>
  65. 0.1
  66. texture
  67. {
  68. pigment { color Green }
  69. }
  70. }
  71. //fuente de luz
  72. light_source {
  73. <4,4,6> color White
  74. }
  75. //otra fuente de luz
  76. light_source {
  77. <0,3,3> color White
  78. }

Como ves; con agredrezado me refiero a que el plano esta formado por dos colores que se repiten en forma de cuadros dando la impresion de lejania o cercania. La Imagen de la Escena que se genera es esta si se ve como un piso ¿o no?:

Renderizado de un plano agedrezado (eje y)

Renderizado de un plano agedrezado (eje y)

…Si descomentamos las lineas 19-26 para mostrar el plano X y el codigo que muestra el plano del eje Z (lineas 39-46), el codigo se veria asi:

  1. /*
  2. Instituto Tecnologico de Zacatepec, Mor.
  3. Descripcion: Uso del objeto plane (plano)
  4. Author: Gonzalo Silverio
  5. Archivo: practica5.pov
  6. Tutorial PovRay: 3.2.4 Objeto Plano
  7. */
  8. #include «colors.inc»
  9. //Posicion de la camara sintetica
  10. camera {
  11. location <12,12,12>
  12. look_at <0,0,0>
  13. }
  14. //Mostrar el plano de X
  15. plane {
  16. <1,0,0>,1
  17. //x,-1 Otra forma de definir este plano
  18. pigment {
  19. //checker color Red, color Blue
  20. color White
  21. }
  22. }
  23. //Mostrar el plano de Y
  24. plane {
  25. y,1
  26. //<0,1,0>,-1 Otra forma de definir este plano
  27. pigment {
  28. checker color Red, color Yellow
  29. }
  30. }
  31. //Mostrar el plano de Z
  32. plane {
  33. <0,0,1>,1
  34. //z,1 Otra forma de definir este plano
  35. pigment {
  36. checker color Red, color White
  37. }
  38. }
  39. //A CONTINUACION SE VAN A DIBUJAR LOS 3 EJES TRIDIMENSIONALES
  40. //Dibujar el eje X
  41. cylinder {
  42. <0,0,0>
  43. <20,0,0>
  44. 0.1
  45. pigment { color Green }
  46. }
  47. //Dibujar el eje Y
  48. cylinder {
  49. <0,0,0>
  50. <0,20,0>
  51. 0.1
  52. texture
  53. {
  54. pigment { color Green }
  55. }
  56. }
  57. //Dibujar el eje Z
  58. cylinder {
  59. <0,0,0>
  60. <0,0,20>
  61. 0.1
  62. texture
  63. {
  64. pigment { color Green }
  65. }
  66. }
  67. //fuente de luz
  68. light_source {
  69. <4,4,6> color White
  70. }
  71. //otra fuente de luz
  72. light_source {
  73. <0,3,3> color White
  74. }

Y la Imagen de la Escena que se genera es esta:

Renderizado de los 3 planos 2 de ellos agedrezados (eje z y eje y). El eje x en color solido

Renderizado de los 3 planos 2 de ellos agedrezados (eje z y eje y). El eje x en color solido

6.- OBJETO TOROIDE (torus)
Y ya por ultimo la forma basica de POV-Ray que quiero mostrar es esta. El Toroide es una figura muy parecida a una rosquilla o ‘donita’. Creo que es la que tiene la sintaxis mas facil de todas las demas; pues solo se define especificando su radio externo y un espesor o grosor como lo he indicado en la siguiente imagen:

Sintaxis del objeto Toroide

Sintaxis del objeto Toroide

Ejemplo de codigo fuente en POV-Ray que muestra un toroide con centro en el origen y desplazado 2 unidades arriba en el je Y:

  1. /*
  2. Instituto Tecnologico de Zacatepec, Mor.
  3. Descripcion: Uso del objeto torus (toroide)
  4. Author: Gonzalo Silverio
  5. Archivo: practica6.pov
  6. Tutorial PovRay: 3.2.5 Objeto Toroide
  7. */
  8. #include «colors.inc»
  9. camera {
  10. location <12,12,12>
  11. look_at <0,0,0>
  12. }
  13. torus { 4, 1 // radio externo y grosor del toro
  14. translate 2*y //Trasladar 2 unidades en eje Y
  15. pigment { Blue }
  16. }
  17. //A CONTINUACION SE VAN A DIBUJAR LOS 3 EJES TRIDIMENSIONALES
  18. //Dibujar el eje X
  19. cylinder {
  20. <0,0,0>
  21. <20,0,0>
  22. 0.1
  23. pigment { color Green }
  24. }
  25. //Dibujar el eje Y
  26. cylinder {
  27. <0,0,0>
  28. <0,20,0>
  29. 0.1
  30. texture
  31. {
  32. pigment { color Green }
  33. }
  34. }
  35. //Dibujar el eje Z
  36. cylinder {
  37. <0,0,0>
  38. <0,0,20>
  39. 0.1
  40. texture
  41. {
  42. pigment { color Green }
  43. }
  44. }
  45. light_source {
  46. <6,6,6> color White
  47. }

La Imagen de la Escena que se genera es esta:

Renderizado de un objeto Toroide

Renderizado de un objeto Toroide

Uff al fin acabe, sinceramente si me tarde en acabar esta entrada del blog y ps espero que a alguien le sirva. Como siempre; si estas interesado en el codigo fuente basta con dejar tu e-mail para que te lo envie. Suerte !!

Como guardar la ruta de un archivo en tabla MySQL y java

A veces en algun programa necesitamos guardar la ruta de un archivo. Por ejemplo si es un programa para llevar el control de empleados tal vez sera necesario guardar las fotografias de los empleados o una imagen de un producto, o la ruta de un archivo de documento, etc. Es por eso que se me ocurrio mostrar como se puede guardar la ruta de un archivo en una tabla de MySQL y recuperarla.

Parece facil, pero tiene su chiste, bueno para mostrar voi a diseñar una sencilla BD con una sola tabla que se llame productos con 3 unicos campos: el Id, el nombre del producto y su imagen (imagen muestra del producto). Los comandos SQL para crear la BD y la tabla son los siguientes:

CREATE DATABASE pruebaRuta;
USE pruebaRuta;
CREATE TABLE productos(id int auto_increment not null,nombre varchar(100), imagen varchar(2000), primary key(id) );

Observe que el id es auto_increment y por lo tanto el DBMS lo genera automaticamente, el campo imagen guarda una cadena que sera la ruta donde esta la imagen del producto.

Ahora imaginemos que las imagenes las tenemos almacenadas en la siguiente ruta del disco duro: c:\imagenes\productos. Podria pensarse que para realizar una insercion para registrar un nuevo producto en la tabla se haria con el comando:

INSERT INTO productos(nombre, imagen) VALUES('Chiles chipotles','c:\imagenes\productos\chipoles_100gr.jpg');

y de hecho si ese comando lo ejecutamos en la consola de MySQL nos dice que se inserto con exito:

 

insercion mal

insercion mal

bien, ahora hagamos un SELECT de la tabla para mostrar si se inserto…

 

select mal

select mal

…pero hooo! sorpresaa faltan las diagonales (slash). al parecer el DBMS las toma como secuencias de escape y las omite, no las guarda pues, desconozco sinceramente por que no guarda las diagonales pero e ideado una clase java que agrega doble diagonal o cualquier otro caracter para reemplazar los separadores de carpetas por unos que si son validos. La forma correcta de registrar un nuevo producto es esta:

INSERT INTO productos(nombre, imagen) VALUES('Chiles chipotles','c:\\imagenes\\productos\\chipoles_100gr.jpg');

ahora muestro como MySQL no manda error:

insert bien

insert bien

y ahora otra vez el SELECT y vemos como ahora si se guardo correctamente

 

select bien

select bien

aahh esta vez si se inserto bien la ruta del producto. Obviamente que las inserciones aqui hechas se han hecho desde la linea comandos del cliente de MySQL pero esta operaciones de INSERT se hacen mediante un programa java con una interfaz de usuario y esas cosas.
Para ilustrar todo esto con un ejemplo practico he creado 3 clases: JfrPrincipal.java, JfrAltaProductos.java, JfrVisorProductos.java, los cuales voi a ir explicando poco a poco a continuacion. No olvidar que el objetivo de este ejemplo es la de mostrar como mandar correctamente la ruta de un archivo a una tabla de MySQL y como recuperarla para mostrar el archivo (p. ej. imagenes, .txt) o abrirlo. A continuacion muestro el diagrama de clases del ejemplo:

Clases del ejemplo Corregir Ruta Archivo

Clases UML del ejemplo Corregir Ruta Archivo

Como se puede observar la clase que nos interesa la e resaltado en otro color, esta clase se instancia desde la clase JfrAltaProductos.java que es la que nos permite dar de alta a un nuevo producto, se llama desde aqui por que antes de dar de alta un producto (INSERT) se debe correguir la ruta.

JfrPrincipal.java
Este archivo es la clase principal y unicamente tiene la funcion de mostrar una GUI con dos botones para que el usuario elija abrir el visor de imagenes o agregue un nuevo producto. En el codigo hay algunos comentarios para describir brevemente que es lo que se hace:

/*
		Instituto Tecnologico de Zacatepec, Mor.
Descripcion:  Ventana principal del ejemplo, desde esta interfaz el usuario puede
					elegir entre ver las imagenes o dar de alta un nuevo producto.
Autor:  Gonzalo Silverio   gonzasilve@gmail.com
Archivo JfrPrincipal.java
*/

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.*;

public class JfrPrincipal extends JFrame
{
	//Constructor
	JfrPrincipal(String titulo, int ancho, int alto)
	{
		//Establecer titulo, tamanio y posicion en la pantalla
		super(titulo);
		setSize(ancho,alto);
		setLocationRelativeTo(null);	//centrado
		//Rotulo principal de la ventana
		JLabel lblTitulo = new JLabel("Ventana principal");
		JPanel panTitulo = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panTitulo.add(lblTitulo);
		//Crear el boton nuevo
		JButton btnNuevo = new JButton("Nuevo");
		JPanel panNuevo = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panNuevo.add(btnNuevo);
		//Crear el boton para abrir el visor de imagenes
		JButton btnVisorImagenes = new JButton("Visor de imagenes");
		JPanel panVisor = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panVisor.add(btnVisorImagenes);
		
		//Todos los componentes estan en un Box Vertical
		//para alinear los controles
		Box boxVertical = Box.createVerticalBox();
		boxVertical.add(Box.createVerticalStrut(50));
		boxVertical.add(panTitulo);
		boxVertical.add(panNuevo);
		boxVertical.add(panVisor);
		//Agregar el Box a la ventana
		add(boxVertical);
		setResizable(false);	//No maximizar ni cambiar tamanio
		//Al dar en la X terminar todo el programa
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    	// ########### ESCUCHADOR BOTON NUEVO   ##########
    	ActionListener escuchadorAlta = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
            JfrAltaProductos ejemplo = new JfrAltaProductos("Alta de un nuevo producto",400,400);
            ejemplo.mostrar();
            //Ocultar la ventana principal
            setVisible(false);
        	}
   		};
    	btnNuevo.addActionListener(escuchadorAlta);

    	// ########### ESCUCHADOR PARA BOTON VISOR DE IMAGENES   ##########
    	ActionListener escuchadorVisor = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
            JfrVisorProductos ejemplo = new JfrVisorProductos("Visor de imagenes de productos",400,400);
            ejemplo.mostrar();
            //Ocultar la ventana principal
            setVisible(false);
        	}
   		};
    	btnVisorImagenes.addActionListener(escuchadorVisor);
    	
	}	//Fin del constructor

	//hace visible la ventana	
	public void mostrar()
	{
		setVisible(true);
	}

	public static void main(String[] args) 
   {
		JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
		ejemplo.mostrar();
   }
}

Ahora muestro imagen de la ventana que genera el codigo anterior:

Ventana principal del ejemplo.

Ventana principal del ejemplo.

Como se puede ver es una interfaz muy sencilla y es el punto de entrada del programa.

JfrAltaProductos.java
Esta clase permite dar de alta un nuevo producto, es decir permite hacer un INSERT en la tabla de productos con el nombre del producto y la ruta que corresponde a una imagen previa de dicho producto. En el codigo se muestra los comentario correspondientes explicando el codigo:

/*
		Instituto Tecnologico de Zacatepec, Mor.
Descripcion:  Ventana para dar de alta a un nuevo producto, antes de dar de alta
			un producto se debe corregir la ruta del archivo de imagen del producto.
Autor:  	Gonzalo Silverio   gonzasilve@gmail.com
Archivo: JfrAltaProductos.java
*/

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.Color;
import java.awt.event.*;
//Para usar la clase File con el FilesChooser
import java.io.*;
//Para usar operacion con BD (JDBC)
import java.sql.*;

public class JfrAltaProductos extends JFrame
{
	
	 //Script SQL para crear la tabla productos:
	 //CREATE TABLE productos(id int auto_increment not null,nombre varchar(100), imagen varchar(2000), primary key(id) );

   JTextArea jtaRutaImagen;
   JTextField jtfNombre;

	private static Connection con = null;
	Statement st;

	//Constructor
	JfrAltaProductos(String titulo, int ancho, int alto)
	{
		super(titulo);
		setSize(ancho,alto);
		setLocationRelativeTo(null);
		JLabel lblTitulo = new JLabel("Datos del producto");
		JPanel panTitulo = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panTitulo.add(lblTitulo);
		
		//Crear una etiqueta y su campo de texto correspondiente para capturar el
		//nombre del producto
		JLabel lblNombre = new JLabel("Nombre: ");
		jtfNombre = new JTextField(20);
		JPanel panNombre = new JPanel(new FlowLayout(FlowLayout.LEFT));
      panNombre.add(Box.createHorizontalStrut(15));
		panNombre.add(lblNombre);
		panNombre.add(jtfNombre);
		//Crear el boton examinar
		JButton btnExaminar = new JButton("Examinar...");
      btnExaminar.addActionListener(new seleccionarImagen());
		
		//Crear el area de texto para mostrar la ruta absoluta del archivo
      JPanel panRutaImagen = new JPanel(new FlowLayout(FlowLayout.LEFT));
         jtaRutaImagen = new JTextArea(4,20);
         jtaRutaImagen.setDisabledTextColor(Color.BLUE);
         jtaRutaImagen.setLineWrap(true);
         jtaRutaImagen.setEnabled(false);
         JScrollPane scrollRutaImagen = new JScrollPane(jtaRutaImagen);
         scrollRutaImagen.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
         scrollRutaImagen.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
      panRutaImagen.add(Box.createHorizontalStrut(15));
      panRutaImagen.add(scrollRutaImagen);
      panRutaImagen.add(btnExaminar);
		//Crear el boton Guardar
		JButton btnGuardar = new JButton("Guardar");
		JPanel panGuardar = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panGuardar.add(btnGuardar);
		//Crear el boton Cancelar
		JButton btnCancelar = new JButton("Cancelar");
		JPanel panCancelar = new JPanel(new FlowLayout(FlowLayout.CENTER));
		panCancelar.add(btnCancelar);
		//Alinear los botones Guardar y Cancelar en forma horizontal
      Box boxGuardarCancelar = Box.createHorizontalBox();
      boxGuardarCancelar.add(btnGuardar);
      boxGuardarCancelar.add(Box.createHorizontalStrut(30));
      boxGuardarCancelar.add(btnCancelar);

		//Agregar todos los controles de usuario al Box Horizontal principal
		Box boxVertical = Box.createVerticalBox();
		boxVertical.add(Box.createVerticalStrut(50));
		boxVertical.add(panTitulo);
      boxVertical.add(Box.createVerticalStrut(50));
      boxVertical.add(panNombre);
      JPanel panEtiquetaRuta = new JPanel(new FlowLayout(FlowLayout.LEFT));
      panEtiquetaRuta.add(Box.createHorizontalStrut(15));
      panEtiquetaRuta.add(new JLabel("Imagen previa del producto"));
      boxVertical.add(panEtiquetaRuta);      
		boxVertical.add(panRutaImagen);
      boxVertical.add(Box.createVerticalStrut(10));
      boxVertical.add(boxGuardarCancelar);
      boxVertical.add(Box.createVerticalStrut(100));
		//Agregar el Box principal a este JFrame
		add(boxVertical);
		//No permitir maximizar ni redimensionar este JFrame
		setResizable(false);

// ##################### ESCUCHADOR DE VENTANA #############################################
    	//Para que al dar clic en la x de la esquina de este JFrame
      //se muestre por default la ventana principal
		this.addWindowListener(new WindowAdapter() 
		{
			public void windowClosing(WindowEvent e)
			{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();

				setVisible(false);
			}

			public void windowClosed(WindowEvent e)
			{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();
				setVisible(false);
			}
		});

    	// ########### ESCUCHADOR BOTON CANCELAR   ##########
    	ActionListener escuchadorCancelar = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();
            setVisible(false);
        	}
   	};
    	btnCancelar.addActionListener(escuchadorCancelar);

    	// ########### ESCUCHADOR BOTON GUARDAR   ##########
    	ActionListener escuchadorGuardar = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
        		//Validar que NO haya campos vacios
            if(hayCamposVacios())
            {
            	JOptionPane.showMessageDialog(null,"Debes escribir el nombre y elegir la ruta de la imagen, hay campos vacios");
            	return;
            }

            if( conectarBaseDatos() )
            {
               if( altaProducto() )
               {
               	JOptionPane.showMessageDialog(null,"Producto guardado con exito");
               	jtfNombre.setText("");
               	jtaRutaImagen.setText("");
               }                  
               else
                  JOptionPane.showMessageDialog(null,"No se pudo guardar");
            }
            else
               JOptionPane.showMessageDialog(null,"No se pudo Conectar la BD");

        	}
   	};
    	btnGuardar.addActionListener(escuchadorGuardar);
    	
	}  	//Fin del costructor

	//Conecta la base de datos y se prepara para un sentencia SQL
	//Devuelve true solo si la conexion tuvo exito
   public boolean conectarBaseDatos()
   {
      try
      {
         Class.forName("com.mysql.jdbc.Driver");
         String strCadenaConexion = "jdbc:mysql://localhost/pruebaRuta";
         con = DriverManager.getConnection(strCadenaConexion,"root","12345");
         if (con == null )
            return false;
         
         //Preparar conexion para ejecutar una sentencia SQL
         st = con.createStatement();
         return true;
      }
      catch(SQLException sqlex)
      {
         sqlex.printStackTrace();
          return false;
      }
      catch(Exception e)
      {
         e.printStackTrace();
         return false;
      }
   }

	//Realiza un ALTA en la tabla de productos
   //devuelve true solo si se pudo realizar con exito el INSERT en la tabla
   public boolean altaProducto()
   {
      try
      {
         String strRutaImagen;
         //Instanciamos la clase que corrige la ruta del archivo
         CorregirRuta ruta1 = new CorregirRuta(jtaRutaImagen.getText(),"\\", "\\\\");
         //CORREGIR LA RUTA
         strRutaImagen = ruta1.obtenerRutaCorregidaWindows();
         //Hacer el insert con la ruta corregida
         int res = st.executeUpdate("INSERT INTO productos(nombre,imagen) VALUES('"+jtfNombre.getText()+"','"+strRutaImagen+"')");
         
         if(res==1)
            return true;
         else
            return false;

      }
      catch(SQLException sqlex)
      {
         sqlex.printStackTrace();
          return false;
      }
      catch(Exception e)
      {
         e.printStackTrace();
         return false;
      }
   }

   //Comprueba true si alguno de los 2 campos esta vacios
   public boolean hayCamposVacios()
   {
      if( jtfNombre.getText().isEmpty() || jtaRutaImagen.getText().isEmpty() )
         return true;
      return false;
   }

   //hace visible la ventana
	public void mostrar()
	{
		setVisible(true);
	}

	//Clase interna
	class seleccionarImagen implements ActionListener
	{
	  public void actionPerformed(ActionEvent ae)
	  {
	   String strSeleccionado;
	   JFileChooser jfcSeleccionarArchivo = new JFileChooser();
	   //Asignar el filtro para que solo se vean imagenes en la ventana abrir
	   jfcSeleccionarArchivo.addChoosableFileFilter(new FiltroImagenes());
	   //Filtro a usarse por defecto
	   jfcSeleccionarArchivo.setFileFilter(jfcSeleccionarArchivo.getChoosableFileFilters()[1]);
	
	      // Abre el cuadro de dialogo Abrir
	      int retval = jfcSeleccionarArchivo.showOpenDialog(JfrAltaProductos.this);
	      if (retval == JFileChooser.APPROVE_OPTION)
	      {
	          //... Si el usuario selecciono un archivo, entonces usarlo
	          File filSeleccionado = jfcSeleccionarArchivo.getSelectedFile();
	          //Obtener ruta absoluta del archivo seleccionado
	          strSeleccionado = filSeleccionado.getAbsolutePath();
	          //Mostrar la ruta al usuario en el area de texto correspondiente
	          jtaRutaImagen.setText(strSeleccionado);
	      }
	  }
	}		//fin de clase interna


}		//Fin de la clase

A continuacion muestro una imagen de la ventana que se genera:

Ventana para dar de Alta un producto.

Ventana para dar de Alta un producto.


Dejando campos vacios…
Mensaje de error al dejar Campos vacios en alta de producto.

Mensaje de error al dejar Campos vacios en alta de producto.

Como se observa e insertado un producto de ejemplo para ilustrar como funciona la ventana. El usuario una vez que escribe el nombre y elije un archivo de imagen (con el Boton Examinar…) debe dar clic en el Boton Guardar; al hacer esto el programa realiza una pequeña validacion de campos vacios y si se logra satisfacer se hace el INSERT. Una vez que se realizo el INSERT el programa limpia los campos para que el usuario siga dando de alta mas productos. Si el usuario ya termino debe dar click en el Boton Cancelar para volver a la ventana principal del ejemplo.

Como se puede observar en el metodo altaProducto() se instancia a la clase CorregirRuta.java (pasandole la ruta sin corregir) y se ejecuta su metodo obtenerRutaCorregidaWindows() para obtener la ruta corregida, tambien en la clase interna seleccionarImagen se hace una instancia de la clase FiltroImagenes.java, a continuacion muestro el codigo de dichas clases:

CorregirRuta.java
Permite corregir al ruta de carpetas de un archivo para poder almacenarla correctamente en una tabla de MySQL. Creo que no necesita mucha explicacion pues en el cabezado del archivo se describe, sin tanto rodeo, el codigo es…

/*
 *		Instituto Tecnologico de Zacatepec, Mor.
 * Descripcion:
 *	Clase que eecibe una ruta de archivo y una cadena que es con la que vienen separadas los nombres de las carpetas
 *  y otra cadena mas que es el nuevo separador con el que se van a separar ahora las carpetas.
 *  Devuelve la ruta ya corregida con el nuevo separador
 * @author: Gonzalo Silverio gonzasilve@gmail.com
 * Archivo: CorregirRuta.java
 * 
 */
import java.util.StringTokenizer;

public class CorregirRuta 
{
    String ruta, separador, nuevoSeparador;	

    public CorregirRuta(String laruta, String sep, String nuevoSep)
    {
    	ruta=laruta;
    	separador=sep;
    	nuevoSeparador=nuevoSep;
    }

    public String obtenerRutaCorregidaWindows()
    {
         StringTokenizer tokens=new StringTokenizer(ruta, separador);
         //Para guardar la ruta corregida
         String rutaCorregida = new String();
         //Contar los tokens (en este caso las carpetas, contado tambien
         // el nombre del archivo seleccionado).
         int noTokens = tokens.countTokens();
         int i = 1;
         do
         {		//Agregar el nuevo separador
            rutaCorregida += tokens.nextToken()+nuevoSeparador;
            i++;
         }while(i<noTokens);
         //Agregar a la ruta corregida el ultimo token, (nombre del archivo)
         rutaCorregida += tokens.nextToken();		
         //Mostrar la ruta corregida en la consola
         System.out.println(rutaCorregida+"\n"+noTokens+ " tokens");
         return rutaCorregida;
    }
}

FiltroImagenes.java
Clase para filtrar unicamente los archivos de imagenes con extension .jpeg , .jpg , .png , .gif en la ventana de dialogo estandar Abrir.

/*
		Instituto Tecnologico de Zacatepec, Mor.
Descripcion:
   Clase que permite mostrar unicamente los ficheros .jpeg,  .jpg,  .gif en los cuadros de dialogo.
   Un filtro es un objeto de la clase FileFilter del paquete javax.swing.filechooser.. FileFilter es una
   clase obstracta con dos metodos abstractos accept y getDescription.
Author:  Gonzalo Silverio   gonzasilve@gmail.com
Archivo FiltroImagenes.java
*/

import javax.swing.filechooser.FileFilter;
import java.io.File;

public class FiltroImagenes extends FileFilter
{
    public boolean accept(File f)
   {
      if( f.isDirectory() )      
         return true;
      
      String nombreArchivo = f.getName().toLowerCase();
      if( nombreArchivo != null )
         if( nombreArchivo.endsWith(".jpeg") ||
            nombreArchivo.endsWith(".jpg")  ||
			nombreArchivo.endsWith(".png")  ||
            nombreArchivo.endsWith(".gif")
           )
            return true;
      
      return false;    
   }
   
   //Descripcion del filtro (se mostrara en la ventana abrir)
   public String getDescription()
   {
      return "Archivos de imagenes ( *.jpg ,  *.png ,  *.gif )";
   }
}        //Fin de la clase

JfrVisorProductos.java
Esta clase crea una ventana muy sencilla para mostrar los datos del producto, principalmente permite leer la ruta almacenada del archivo de imagen muestra del producto. En el codigo he comentado las partes mas importantes…

/*
		Instituto Tecnologico de Zacatepec, Mor.
Descripcion:  Ventana para mostrar las imagenes de los productos.
Autor:  Gonzalo Silverio   gonzasilve@gmail.com
Archivo: JfrVisorProductos.java
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.sql.*;

public class JfrVisorProductos extends JFrame
{
   JPanel panelPrincipal, panelSuperior,panelInferior;

	private static Connection con = null;
	Statement st;
	ResultSet rs;
	
	int idsProductos[];    //Contiene los ID de los productos
	//Apunta al registro que se esta mostrando actualmente
	//Po defecto apuntar antes del primero
	int regActual = -1;
	int totalRegistros = 0;         //Contiene el total de registros que hay en la tabla
   JLabel lblNombreProducto = new JLabel("Nombre imagen");
   JPanel panImagen;
   JLabel lblImagen;
	Icon imagenn;
   
	JButton btnAnterior = new JButton("Anterior");
	JButton btnSiguiente  = new JButton("Siguiente");;
      
	Box boxpanSuperior;

   JfrVisorProductos(String tituloVentana, int ancho, int alto)
   {
      //Establecer titulo,tamanio, si es redimensionable y la posicion
      // de la ventana
      setTitle(tituloVentana);
      setSize(ancho,alto);
      this.setResizable(false);
      setLocationRelativeTo(null);
      
      JPanel panNombreProducto = new JPanel(new FlowLayout(FlowLayout.CENTER));
      panNombreProducto.add(lblNombreProducto);
      
      panelPrincipal = new JPanel(new BorderLayout());
      panelSuperior = new JPanel(new BorderLayout());
      panelInferior = new JPanel(new BorderLayout());
      btnAnterior.setMnemonic(KeyEvent.VK_A);
      btnSiguiente.setMnemonic(KeyEvent.VK_S);
      imagenn = new ImageIcon();
      lblImagen = new JLabel(imagenn);

      panImagen = new JPanel(new FlowLayout(FlowLayout.CENTER));
      panImagen.add(new JScrollPane(lblImagen), BorderLayout.CENTER);
      
      panelSuperior.add(panImagen);
      boxpanSuperior = Box.createVerticalBox();      
      boxpanSuperior.add(panNombreProducto);
      boxpanSuperior.add(panelSuperior);
      
      panelInferior.add(btnAnterior, BorderLayout.WEST);
      panelInferior.add(btnSiguiente, BorderLayout.EAST);
      panelPrincipal.add(boxpanSuperior, BorderLayout.CENTER);
      panelPrincipal.add(panelInferior, BorderLayout.SOUTH);

      add(panelPrincipal);
      inicializar();		//Cargar los IDs
      siguiente();		//Moverse al primer registro (estabamos uno antes del primero)
      
// ##################### ESCUCHADOR DE VENTANA #############################################
    	//Para que al dar clic en la x de la esquina de este JFrame
      //se muestre por default la ventana principal
	this.addWindowListener(new WindowAdapter() {

			public void windowClosing(WindowEvent e)
			{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();

				setVisible(false);
			}

			public void windowClosed(WindowEvent e)
			{
            JfrPrincipal ejemplo = new JfrPrincipal("Visor de Imagenes de productos",400,400);
            ejemplo.mostrar();
				setVisible(false);
			}
		});

    	// ########### ESCUCHADOR BOTON ANTERIOR   ##########
    	ActionListener escuchadorAnterior = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
				anterior();				//Va al anterior registro de la tabla
        	}
   		};
    	btnAnterior.addActionListener(escuchadorAnterior);

    	// ########### ESCUCHADOR BOTON SIGUIENTE   ##########
    	ActionListener escuchadorSiguiente = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
				siguiente();				//Va al siguiente registro de la tabla
        	}
   		};
    	btnSiguiente.addActionListener(escuchadorSiguiente);
    	
   }		//Fin del constructor

    //Inicializa el arreglo de IDs para que se puedan recorrer los registros 
    //y actualiza la variable que contiene el total de registros que hay en la tabla
    public void inicializar()
    {
        try
        {
            conectarBaseDatos();		//Nos conectamos con la BD
            rs = st.executeQuery("SELECT * FROM productos"); //seleccionamos todos los de la tabla productos

            //A continuacion se van a guardar en un arreglo los IDs de todos los productos
            if(! rs.first() )             //Nos movemos al primer registro
            	JOptionPane.showMessageDialog(null,"La tabla de productos esta vacia.");
	
            int contador = 0 ;
            do
                contador ++ ;           //Contar cuantos registros hay en la tabla productos
            while(rs.next());
            totalRegistros = contador-1;      //Guarda el numero de registros que hay en la tabla

            idsProductos = new int[contador];            //Crea el arreglo de IDs
            contador = 0;       //Reinicializar el contador
            rs.first();             //Nos movemos al primer registro
            do
                idsProductos[contador++]= rs.getInt("id");
            while(rs.next());

        }
        catch( SQLException sqlex  )
        {
            JOptionPane.showMessageDialog(null,"Error al inicializar el arreglo de IDs");
        }

    }		//Fin del metodo
    
    //permite desplazarse al anterior registro de la tabla
    public void anterior()
    {       
        regActual = regActual - 1;
        if ( regActual < 0 )
            regActual = 0;

        if(!consultarID())
            JOptionPane.showMessageDialog(null,"Error al ir al registro Anterior");
    }
	
	//permite desplazarse al siguiente registro de la tabla
    public void siguiente()
    {
        regActual = regActual + 1;
        if ( regActual > totalRegistros )
            regActual = totalRegistros;

        if(!consultarID())
            JOptionPane.showMessageDialog(null,"Error al ir al siguiente registro");
    }

    
    //Realiza una consulta con el ID seleccionado en regActual en el arreglo idsProductos[], 
    //devuelve true si se realizo la consulta con exito, en caso contrario devuelve false
    private boolean consultarID()
    {
        try
        {
            rs = st.executeQuery("SELECT * FROM productos where id="+idsProductos[regActual] ); //seleccionamos todos los de la tabla productos
            rs.first();                 //moverse al primer registro
            poblarCampos();
            return true;                //Todo se ejecuto con exito
        }
        catch(SQLException sqlex)
        {
            return false;
        }
    }		//Fin del metodo
    
    //rellena los campos con los datos del registro apuntado actualmente
    private void poblarCampos()
    {
        try
        {            
            lblNombreProducto.setText(rs.getString("nombre"));
            panImagen.remove(lblImagen);	//Borrar la imagen anterior
            //Recuperar de la BD la ruta del archivo de imagen
            imagenn = new ImageIcon(rs.getString("imagen"));	
            lblImagen = new JLabel(imagenn); //Cargar nueva imagen
            panImagen.add(lblImagen);	
            validate();
            repaint();	
				//Mostrar en la barra de titulo el reg. actual y el total
				setTitle("Visor de imagenes [producto "+(regActual+1)+" de "+(totalRegistros+1)+"]");

        }
        catch( SQLException sqlex  )
        {
            JOptionPane.showMessageDialog(null,"Error al rellenar los campos");
        }        
    }		//Fin del metodo
    

	//Conecta la base de datos y se prepara para un sentencia SQL
	//Devuelve true solo si la conexion tuvo exito
   public boolean conectarBaseDatos()
   {
      try
      {
         Class.forName("com.mysql.jdbc.Driver");
         String strCadenaConexion = "jdbc:mysql://localhost/pruebaRuta";
         con = DriverManager.getConnection(strCadenaConexion,"root","12345");
         if (con == null )
            return false;
         
         st = con.createStatement();
         return true;
      }
      catch(SQLException sqlex)
      {
         sqlex.printStackTrace();
          return false;
      }
      catch(Exception e)
      {
         e.printStackTrace();
         return false;
      }
   }		//Fin del metodo
   
	//hacer visible la ventana
	public void mostrar()
	{
		setVisible(true);
	}

}	//Fin de la clase

El aspecto de la ventana que se genera es esta:

Visor de imagenes de productos

Visor de imagenes de productos



Como se puede observar en el codigo e ideado una manera de recorrrer los registros de la tabla con dos botones, me parece interesante esto; lo mas probable es que en otra entrada del blog publique algo al respecto pero ya con los 4 botones de navegacion de registros (Primero,Anterior,Siguiente,Ultimo).

Nota: La marca Sabritas, Rufles y Coca-Cola son marcas registradas y solo las e puesto aqui con propositos educativos, si el autor(es) desea que la retire basta con pedirlo.

Bueno esto creo que se alargo demasiado, el objetivo era corregir la ruta y meti varias cosas mas, jajaja pero estoy seguro que aprendi mas y espero que tu tambien. Si estas leyendo esto es por que me imagino que leiste todo lo anterior. Ya sabes si tienes dudas puedes dejar un comentario, o si quieres los .java basta con dejar tu mail… hasta pronto y gracias por pasar por aqui ;).

Uso de la clase JTabbedPane

En esta ocasion mostrare como se utiliza la clase JTabbedPane para insertar varias fichas dentro de un JFrame, 3 en este caso. El codigo es el siguiente:

/*
 * Descripcion:  Clase que muestra el uso de la clase JTabbedPane para insertar fichas
 *               dentro de un JFrame.
 * Archivo:      PruebaJTabbedPane.java
 * Fecha:        29/12/2009
 *
 * @author gonzasilve@gmail.com
 */

/*       metodo JTabbedPane.add()
            Primer  argumento:  Titulo de la ficha.
            Segundo argumento:  Icon, icono de la ficha de la ficha.
            Tercer  argumento:  Un objeto Component que representa la GUI a mostrar cuanda se da clic en la ficha.
            Cuarto  argumento:  Una cadena de texto que especifica el ToolTp de la ficha (texto que se muestra al colocar mouse sobre la ficha). */

import javax.swing.*;       // Para poder usar JTabbedPane 
import java.awt.*;          // Para poder usar FlowLayout y  componentes varios

public class PruebaJTabbedPane extends JFrame
{
    JTabbedPane panelFichas = new JTabbedPane();
    Box contAntesDeFicha;
    Box boxContenidoFrame;

    PruebaJTabbedPane(String titulo, int ancho, int alto)
    {
        super(titulo);
        setSize(ancho, alto);

        JPanel panFicha1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panFicha1.add(new JLabel("Contenido de la ficha1"));
        ImageIcon iconoFicha1 = new ImageIcon(getClass().getResource("iconoFicha1.gif"));
        panelFichas.addTab("Trabajo", iconoFicha1,panFicha1,"ficha1");

        JPanel panFicha2 = new JPanel(new FlowLayout(FlowLayout.CENTER));
        panFicha2.add(new JLabel("Contenido de la ficha2"));
        ImageIcon iconoFicha2 = new ImageIcon(getClass().getResource("iconoFicha2.gif"));
        panelFichas.addTab("Datos personales", iconoFicha2,panFicha2,"tooltip ficha2");

        JPanel panFicha3 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel panCampoNombre = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblNombre = new JLabel("Nombre");
            JTextField jtfNombre = new JTextField(10);
        panCampoNombre.add(lblNombre);
        panCampoNombre.add(jtfNombre);
        panFicha3.add(panCampoNombre);
        ImageIcon iconoFicha3 = new ImageIcon(getClass().getResource("iconoFicha3.gif"));
        panelFichas.addTab("Otros", iconoFicha3,panFicha3,"tooltip ficha3");

        // Contenido que se insertara antes de agregar las fichas al JFrame
        contAntesDeFicha = Box.createVerticalBox();
        JTextField jtfCajaBusqueda = new JTextField(30);
        JButton btnBuscar = new JButton("Buscar");
        JPanel panBusqueda = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panBusqueda.add(jtfCajaBusqueda);
        panBusqueda.add(btnBuscar);

        // Separamos la caja de busqueda de el borde superior de la ventana
        contAntesDeFicha.add(Box.createVerticalStrut(20));
        contAntesDeFicha.add(panBusqueda);

        JPanel panAntes = new JPanel(new BorderLayout());
        panAntes.add(contAntesDeFicha);
        JPanel panFichas = new JPanel(new BorderLayout());
        panFichas.add(panelFichas);

        boxContenidoFrame = Box.createVerticalBox();
        boxContenidoFrame.add(panAntes);
        boxContenidoFrame.add(panFichas);
        add(boxContenidoFrame);

        this.setLocationRelativeTo(this);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void mostrar()
    {
        setVisible(true);
    }

    public static void main(String args[])
    {
        PruebaJTabbedPane prueba1 = new PruebaJTabbedPane("Prueba de JTabbedPane",800,500);
        prueba1.mostrar();
    }
}

y aca una imagen de la ventana que genera este codigo:

Espero le sirva a alguien, hasta pronto
}

Diseño de Ventana empleados usando la clase Box

En esta ocasion dejo una ejemplo de como disear una ventana usando la Clase Box. Los iconos que utilice estan en mi pagina web, en este link. El diseño de la ventana es sobre una tabla llamada empleados, que obviamente guarda informacion sobre empleados de una empresa ficticia.

La ventana esta diseñada para mostrar los campos de esta tabla, creada en Mysql:

Como se puede observar a continuacion es bastante codigo, pero bueno pienso que vale la pena con tal de aprender como se diseña una ventana de estas desde 0 (sin ayuda de ningun IDE).

/**
 * @(#)JfrEmpleados.java
 * Descripcion: Interfaz grafica de Empleados, este JFrame permite al usuario
 * llevar el control de empleados.
 *
 * @author gonzasilve@gmail.com
 * @version 1.00 2009/11/17
 */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import java.util.*;

//Importar clases para manejo de BD (en este ejemplo no
//                                   se usa ninguna clase de este paquete)
import java.sql.*;

public class JfrEmpleados extends JFrame
{
		/*
	 *Prefijos:
	 *	jtx		JTextField
	 *	jpf		JPasswordField
	 *	jcb		jComboBox
	 *	btn		JButton
	 *	lbl		JLabel
	 *	pan		JPanel
	 *	fra		JFrame
	 *	box		Box
	 *  jrb		JRadioButton
	 *
	 **/

	//Constructor que crea la interfaz grafic de la ventan principal
    public JfrEmpleados()
    {
    	setTitle("Hardware Solutions S.A. de C.V. -Empleados");
    	setSize(900,620);
    	this.setLocationRelativeTo(this);	//Centramos este JFrame en la pantalla
        this.setResizable(false);
        this.setIconImage(new ImageIcon(getClass().getResource("iconoEmpleados.png")).getImage());
        //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //Box que contendra todo el contenido del JFrame
        Box boxContenidoVertical = Box.createVerticalBox();

        //Disenio del rotulo principal superior del JFrame
        Box boxHRotuloPrincipal = Box.createHorizontalBox();
        JLabel lblRotuloSistema = new JLabel("Hardware Solutions S.A. de C.V.");
        lblRotuloSistema.setFont(new Font("Arial",Font.BOLD,20));
        lblRotuloSistema.setForeground(Color.BLUE);
        JLabel lblIconoEmpleados = new JLabel(new ImageIcon(this.getClass().getResource("icono_empleados.png")));
        JLabel lblRotuloEmpleados = new JLabel("Empleados");
        lblRotuloEmpleados.setFont(new Font("Arial",Font.BOLD,20));
        lblRotuloEmpleados.setForeground(Color.GREEN);
        JButton btnCerrarEmpleados = new JButton();
        btnCerrarEmpleados.setMargin(new Insets(0, 0, 0, 0));
        btnCerrarEmpleados.setIcon(new ImageIcon(this.getClass().getResource("icono_cerrar.png")));
        boxHRotuloPrincipal.add(Box.createHorizontalStrut(15));
        boxHRotuloPrincipal.add(lblRotuloSistema);
        boxHRotuloPrincipal.add(Box.createHorizontalStrut(80));
        boxHRotuloPrincipal.add(lblIconoEmpleados);
        boxHRotuloPrincipal.add(Box.createHorizontalStrut(8));
        boxHRotuloPrincipal.add(lblRotuloEmpleados);
        boxHRotuloPrincipal.add(Box.createHorizontalStrut(262));
        boxHRotuloPrincipal.add(btnCerrarEmpleados);
        JPanel panRotuloPrincipal = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panRotuloPrincipal.setBackground(Color.white);
        panRotuloPrincipal.add(boxHRotuloPrincipal);

        //Creacion de los botones Principales de la parte superior del JFrame
        JButton btnNuevo = new JButton();
        btnNuevo.setIcon(new ImageIcon(getClass().getResource("icono_nuevo.png")));
        btnNuevo.setMargin(new Insets(0, 3, 0, 0));
        btnNuevo.setToolTipText("Nuevo empleado");
        JButton btnModificar = new JButton();
        btnModificar.setIcon(new ImageIcon(getClass().getResource("icono_modificar.png")));
        btnModificar.setMargin(new Insets(0, 3, 0, 0));
        btnModificar.setToolTipText("Modificar datos del empleado actual");
        JButton btnEliminar = new JButton();
        btnEliminar.setIcon(new ImageIcon(getClass().getResource("icono_eliminar.png")));
        btnEliminar.setMargin(new Insets(0, 2, 0, 0));
        btnEliminar.setToolTipText("Dar de baja al empleado actual");
        JButton btnListar = new JButton();
        btnListar.setIcon(new ImageIcon(getClass().getResource("icono_listar.png")));
        btnListar.setMargin(new Insets(0, 3, 0, 2));
        btnListar.setToolTipText("Listar en una tabla a todos los empleados");
        JButton btnFinBusqueda = new JButton("Terminar busqueda");
        btnFinBusqueda.setIcon(new ImageIcon(getClass().getResource("icono_Finbuscar.gif")));
        btnFinBusqueda.setMargin(new Insets(0, 3, 0, 3));
        btnFinBusqueda.setToolTipText("Mostrar todos los empleados");

        Box boxHBotonesPrincipales = Box.createHorizontalBox();
        JPanel panBotonesPrincipales = new JPanel(new FlowLayout(FlowLayout.LEFT));
        boxHBotonesPrincipales.add(Box.createHorizontalStrut(40));
        boxHBotonesPrincipales.add(btnNuevo);
        boxHBotonesPrincipales.add(Box.createHorizontalStrut(25));
        boxHBotonesPrincipales.add(btnModificar);
        boxHBotonesPrincipales.add(Box.createHorizontalStrut(25));
        boxHBotonesPrincipales.add(btnEliminar);
        boxHBotonesPrincipales.add(Box.createHorizontalStrut(30));
        boxHBotonesPrincipales.add(btnListar);
        boxHBotonesPrincipales.add(Box.createHorizontalStrut(150));
        boxHBotonesPrincipales.add(btnFinBusqueda);
        panBotonesPrincipales.add(boxHBotonesPrincipales);

        //Creacion de la caja de busqueda y el rotulo del nombre del empleado
        //Creacion de caja de busqueda
        JTextField jtfCajaBusqueda = new JTextField(15);
        JButton btnBuscar = new JButton("Buscar", new ImageIcon(getClass().getResource("icono_buscar16.gif")));
        JButton btnOpcionesBusqueda = new JButton();
        btnOpcionesBusqueda.setMargin(new Insets(0, 0, 0, 0));
        btnOpcionesBusqueda.setIcon(new ImageIcon(getClass().getResource("icono_configurar16.png")));
        btnOpcionesBusqueda.setToolTipText("Opciones de busqueda");
        Box boxHBusqueda = Box.createHorizontalBox();
        boxHBusqueda.add(Box.createHorizontalStrut(10));
        boxHBusqueda.add(jtfCajaBusqueda);
        boxHBusqueda.add(Box.createHorizontalStrut(5));
        boxHBusqueda.add(btnBuscar);
        boxHBusqueda.add(Box.createHorizontalStrut(5));
        boxHBusqueda.add(btnOpcionesBusqueda);
        JPanel panBusqueda = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panBusqueda.add(boxHBusqueda);

        //Creacion de la etiqueta de nombre de empleado
        JLabel lblNombreEmpleado = new JLabel("> Xavier Franco Silva");
        lblNombreEmpleado.setFont(new Font("Arial",Font.BOLD,20));
        lblNombreEmpleado.setForeground(Color.BLUE);
        Box boxHNombreEmpleado = Box.createHorizontalBox();
        boxHNombreEmpleado.add(Box.createHorizontalStrut(10));
        boxHNombreEmpleado.add(lblNombreEmpleado);
        boxHNombreEmpleado.add(Box.createHorizontalStrut(285));         //tamanio del fondo del nombre del empleado
        JPanel panNombreEmpleado = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panNombreEmpleado.setBackground(new Color(174,156,244));
        panNombreEmpleado.add(boxHNombreEmpleado);

        Box boxHBusquedaYNombre = Box.createHorizontalBox();
        boxHBusquedaYNombre.add(panBusqueda);
        boxHBusquedaYNombre.add(Box.createHorizontalStrut(20));
        boxHBusquedaYNombre.add(panNombreEmpleado);
        JPanel panBusquedaYNombre = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panBusquedaYNombre.add(boxHBusquedaYNombre);

        //Creacion de la lista de nombre sy la ficha de datos del empleado
        //Creacion de la lista de nombres
        Box boxVListaNombres = Box.createVerticalBox();
        Box boxHEspaciosSuperiorNombres = Box.createHorizontalBox();
        boxHEspaciosSuperiorNombres.add(Box.createHorizontalStrut(170));    //Espacio arriba de la lista de nombres
        boxVListaNombres.add(boxHEspaciosSuperiorNombres);
        JList lstListaNombres = new JList();
        DefaultListModel modeloNombres = new DefaultListModel();
        modeloNombres.addElement("Juan carlos");
        modeloNombres.addElement("Samuel Arturo");
        modeloNombres.addElement("Armando");
        modeloNombres.addElement("Juan carlos");
        modeloNombres.addElement("Samuel Arturo");
        modeloNombres.addElement("Armando");
        lstListaNombres.setVisibleRowCount(16);          //Numero de elementos que se muestran al usuario
        lstListaNombres.setModel(modeloNombres);
        JScrollPane scrollListaNombres = new JScrollPane(lstListaNombres);
        boxVListaNombres.add(scrollListaNombres);
        JPanel panboxVListaNombres = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panboxVListaNombres.add(boxVListaNombres);

        //Creacion del contenido de las fichas
        Box boxVFichas = Box.createVerticalBox();
        Box boxHEspaciosSuperiorFichas = Box.createHorizontalBox();
        boxHEspaciosSuperiorFichas.add(Box.createHorizontalStrut(100));    //Espacio arriba de las fichas
        boxVFichas.add(boxHEspaciosSuperiorFichas);
        Color colorEtiquetas = Color.BLUE;
        Color colorInhabilitados = Color.BLACK;
        //Disenio del contenido de la               FICHA DE DATOS LABORALES
        //Columan 1
        JTabbedPane jtpDatosEmpleado = new JTabbedPane();
        JPanel panFicha1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel panID= new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblIDEmpleado = new JLabel("ID                    ");
            lblIDEmpleado.setForeground(colorEtiquetas);
            JTextField jtfIDEmpleado = new JTextField(20);
            jtfIDEmpleado.setDisabledTextColor(colorInhabilitados);
        panID.add(lblIDEmpleado);
        panID.add(jtfIDEmpleado);
        JPanel panCargo= new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblCargo = new JLabel("Cargo              ");
            lblCargo.setForeground(colorEtiquetas);
            JTextField jtfCargo = new JTextField(20);
            jtfCargo.setDisabledTextColor(colorInhabilitados);
        panCargo.add(lblCargo);
        panCargo.add(jtfCargo);
        JPanel panDepartamento= new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblDepartamento = new JLabel("Departamento ");
            lblDepartamento.setForeground(colorEtiquetas);
            JTextField jtfDepartamento = new JTextField(20);
            jtfDepartamento.setDisabledTextColor(colorInhabilitados);
        panDepartamento.add(lblDepartamento);
        panDepartamento.add(jtfDepartamento);
        JPanel panJefeDirecto = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblJefeDirecto = new JLabel("Jefe directo      ");
            lblJefeDirecto.setForeground(colorEtiquetas);
            JTextField jtfJefeDirecto = new JTextField(20);
            jtfJefeDirecto.setDisabledTextColor(colorInhabilitados);
        panJefeDirecto.add(lblJefeDirecto);
        panJefeDirecto.add(jtfJefeDirecto);
        JPanel panFechaContratacion = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblFechaContratacion = new JLabel("<html>Fecha de <br>contratacion&nbsp&nbsp&nbsp&nbsp&nbsp</html>");
            lblFechaContratacion.setForeground(colorEtiquetas);
            JTextField jtfFechaContratacion = new JTextField(20);
            jtfFechaContratacion.setDisabledTextColor(colorInhabilitados);
        panFechaContratacion.add(lblFechaContratacion);
        panFechaContratacion.add(jtfFechaContratacion);
        JPanel panTratamiento = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblTratamiento = new JLabel("Tratamiento     ");
            lblTratamiento.setForeground(colorEtiquetas);
            JTextField jtfTratamiento = new JTextField(20);
            jtfTratamiento.setDisabledTextColor(colorInhabilitados);
        panTratamiento.add(lblTratamiento);
        panTratamiento.add(jtfTratamiento);
        //Columna 2
        JPanel panInfoSalario1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblInfoSalario1 = new JLabel("Salario en base a:                                   ");
            lblInfoSalario1.setForeground(colorEtiquetas);
            JComboBox jcbTiposSalario = new JComboBox();
            jcbTiposSalario.addItem("Salario base");
            jcbTiposSalario.addItem("Salario por comision");
            jcbTiposSalario.addItem("Salario base + comision");
            jcbTiposSalario.addItem("Salario por horas trabajadas");
            jcbTiposSalario.setMaximumRowCount(4);
        JPanel panCamposInfoSalario1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panCamposInfoSalario1.add(lblInfoSalario1);
        Box boxVInfoSalario = Box.createVerticalBox();
        boxVInfoSalario.add(panCamposInfoSalario1);
        boxVInfoSalario.add(jcbTiposSalario);
        panInfoSalario1.add(boxVInfoSalario);
        JPanel panInfoSalario2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblInfoSalario2 = new JLabel("Sueldo base (S)           ");
            lblInfoSalario2.setForeground(colorEtiquetas);
            JTextField jtfInfoSalario1 = new JTextField(10);
            jtfInfoSalario1.setDisabledTextColor(colorInhabilitados);
        panInfoSalario2.add(lblInfoSalario2);
        panInfoSalario2.add(jtfInfoSalario1);
        JPanel panInfoSalario3 = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblInfoSalario3 = new JLabel("Tasa de comision (%)  ");
            lblInfoSalario3.setForeground(colorEtiquetas);
            JTextField jtfInfoSalario2 = new JTextField(10);
            jtfInfoSalario2.setDisabledTextColor(colorInhabilitados);
        panInfoSalario3.add(lblInfoSalario3);
        panInfoSalario3.add(jtfInfoSalario2);

        Box boxHFichaLaborales = Box.createHorizontalBox();
        Box boxVColumna1Ficha1 = Box.createVerticalBox();
        Box boxVColumna2Ficha1 = Box.createVerticalBox();

        boxVColumna1Ficha1.add(Box.createVerticalStrut(10));
        boxVColumna1Ficha1.add(panID);
        boxVColumna1Ficha1.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha1.add(panCargo);
        boxVColumna1Ficha1.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha1.add(panDepartamento);
        boxVColumna1Ficha1.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha1.add(panJefeDirecto);
        boxVColumna1Ficha1.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha1.add(panFechaContratacion);
        boxVColumna1Ficha1.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha1.add(panTratamiento);

        boxVColumna2Ficha1.add(panInfoSalario1);
        boxVColumna2Ficha1.add(Box.createVerticalStrut(12));
        boxVColumna2Ficha1.add(panInfoSalario2);
        boxVColumna2Ficha1.add(Box.createVerticalStrut(8));
        boxVColumna2Ficha1.add(panInfoSalario3);
        JPanel panboxVColumna2Ficha1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panboxVColumna2Ficha1.add(boxVColumna2Ficha1);

        boxHFichaLaborales.add(Box.createHorizontalStrut(10));
        boxHFichaLaborales.add(boxVColumna1Ficha1);
        boxHFichaLaborales.add(Box.createHorizontalStrut(15));
        boxHFichaLaborales.add(panboxVColumna2Ficha1);
        panFicha1.add(boxHFichaLaborales);
        ImageIcon iconoFichaDatosLaborales = new ImageIcon(getClass().getResource("iconoFichaLaborales.gif"));
        jtpDatosEmpleado.addTab("Datos laborales",iconoFichaDatosLaborales, panFicha1,"Datos del trabajo");

        //Disenio del contenido de la               FICHA DE DATOS PERSONALES
        JPanel panFicha2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel panNombre= new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblNombre = new JLabel("Nombre    ");
            lblNombre.setForeground(colorEtiquetas);
            JTextField jtfNombre = new JTextField(20);
            jtfNombre.setDisabledTextColor(colorInhabilitados);
        panNombre.add(lblNombre);
        panNombre.add(jtfNombre);
        JPanel panApellidos = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblApellidos = new JLabel("Apellidos ");
            lblApellidos.setForeground(colorEtiquetas);
            JTextField jtfApellidos = new JTextField(20);
            jtfApellidos.setDisabledTextColor(colorInhabilitados);
        panApellidos.add(lblApellidos);
        panApellidos.add(jtfApellidos);
        JPanel panSexo = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblSexo = new JLabel("Sexo         ");
            lblSexo.setForeground(colorEtiquetas);
            JComboBox jcbSexo = new JComboBox();
            jcbSexo.addItem("Masculino     ");
            jcbSexo.addItem("Femenino");
            jcbSexo.setMaximumRowCount(2);
        panSexo.add(lblSexo);
        panSexo.add(jcbSexo);
        JPanel panTelefono = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblTelefono = new JLabel("Telefono  ");
            lblTelefono.setForeground(colorEtiquetas);
            JTextField jtfTelefono = new JTextField(20);
            jtfTelefono.setDisabledTextColor(colorInhabilitados);
        panTelefono.add(lblTelefono);
        panTelefono.add(jtfTelefono);
        JPanel panEdad = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblEdad = new JLabel("Edad        ");
            lblEdad.setForeground(colorEtiquetas);
            JTextField jtfEdad = new JTextField(20);
            jtfTelefono.setDisabledTextColor(colorInhabilitados);
        panEdad.add(lblEdad);
        panEdad.add(jtfEdad);
        JPanel panCorreo = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblCorreo = new JLabel("Correo     ");
            lblCorreo.setForeground(colorEtiquetas);
            JTextField jtfCorreo = new JTextField(20);
            jtfCorreo.setDisabledTextColor(colorInhabilitados);
        panCorreo.add(lblCorreo);
        panCorreo.add(jtfCorreo);

        //Contenido de columna2 ficha 2
        JPanel panInfoFotografia = new JPanel(new FlowLayout(FlowLayout.CENTER));
            JLabel lblInfoFotografia = new JLabel("Fotografia");
        panInfoFotografia.add(lblInfoFotografia);
        JPanel panFotografia = new JPanel(new FlowLayout(FlowLayout.CENTER));
            JLabel lblFotografia = new JLabel();
            ImageIcon iconofotografia = new ImageIcon(getClass().getResource("sin_fotografia.gif"));
            lblFotografia.setIcon(iconofotografia);
        panFotografia.add(lblFotografia);
        JPanel panbtnCambiarFotografia = new JPanel(new FlowLayout(FlowLayout.LEFT));
            ImageIcon iconoModificarFotografia = new ImageIcon(getClass().getResource("iconoCambiar_fotografia.png"));
            JButton btnModificarFotografia = new JButton(iconoModificarFotografia);
            btnModificarFotografia.setMargin(new Insets(0, 0, 0, 0));
            btnModificarFotografia.setToolTipText("Cambiar fotografia");
        panbtnCambiarFotografia.add(btnModificarFotografia);
        JPanel panbtnQuitarFotografia = new JPanel(new FlowLayout(FlowLayout.LEFT));
            ImageIcon iconoQuitarFotografia = new ImageIcon(getClass().getResource("iconoQuitar_fotografia.png"));
            JButton btnQuitarFotografia = new JButton(iconoQuitarFotografia);
            btnQuitarFotografia.setMargin(new Insets(0, 0, 0, 0));
            btnQuitarFotografia.setToolTipText("Quitar fotografia");
        panbtnQuitarFotografia.add(btnQuitarFotografia);
        JPanel panbtnRevertirFotografia = new JPanel(new FlowLayout(FlowLayout.LEFT));
            ImageIcon iconoRevertirFotografia = new ImageIcon(getClass().getResource("iconoRevertir_fotografia.png"));
            JButton btnRevertirFotografia = new JButton(iconoRevertirFotografia);
            btnRevertirFotografia.setMargin(new Insets(0, 0, 0, 0));
            btnRevertirFotografia.setToolTipText("Revertir dejando la que estaba");
        panbtnRevertirFotografia.add(btnRevertirFotografia);

        Box boxHFichaPersonales = Box.createHorizontalBox();
        Box boxVColumna1Ficha2 = Box.createVerticalBox();
        Box boxHColumna2Ficha2 = Box.createHorizontalBox();
        Box boxVCol1Columna2Ficha2 = Box.createVerticalBox();
        Box boxVCol2Columna2Ficha2 = Box.createVerticalBox();

        boxVColumna1Ficha2.add(Box.createVerticalStrut(10));
        boxVColumna1Ficha2.add(panNombre);
        boxVColumna1Ficha2.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha2.add(panApellidos);
        boxVColumna1Ficha2.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha2.add(panSexo);
        boxVColumna1Ficha2.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha2.add(panTelefono);
        boxVColumna1Ficha2.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha2.add(panEdad);
        boxVColumna1Ficha2.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha2.add(panCorreo);

        boxVCol1Columna2Ficha2.add(panInfoFotografia);
        boxVCol1Columna2Ficha2.add(panFotografia);

        boxVCol2Columna2Ficha2.add(Box.createVerticalStrut(40));
        boxVCol2Columna2Ficha2.add(panbtnCambiarFotografia);
        boxVCol2Columna2Ficha2.add(panbtnQuitarFotografia);
        boxVCol2Columna2Ficha2.add(panbtnRevertirFotografia);
        JPanel panboxVCol2Columna2Ficha2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panboxVCol2Columna2Ficha2.add(boxVCol2Columna2Ficha2);

        boxHColumna2Ficha2.add(boxVCol1Columna2Ficha2);
        boxHColumna2Ficha2.add(panboxVCol2Columna2Ficha2);

        JPanel panboxVColumna2Ficha2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panboxVColumna2Ficha2.add(boxHColumna2Ficha2);

        boxHFichaPersonales.add(Box.createHorizontalStrut(10));
        boxHFichaPersonales.add(boxVColumna1Ficha2);
        boxHFichaPersonales.add(Box.createHorizontalStrut(50));
        boxHFichaPersonales.add(panboxVColumna2Ficha2);

        panFicha2.add(boxHFichaPersonales);
        ImageIcon iconoFicha2 = new ImageIcon(getClass().getResource("iconoFichaPersonales.gif"));
        jtpDatosEmpleado.addTab("Datos personales", iconoFicha2, panFicha2,"Datos personales");

		//Disenio del contenido de la               FICHA  DIRECCION
        JPanel panFicha3 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel panNacionalidad = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblNacionalidad = new JLabel("Nacionalidad  ");
            lblNacionalidad.setForeground(colorEtiquetas);
            JTextField jtfNacionalidad = new JTextField(20);
            jtfNacionalidad.setDisabledTextColor(colorInhabilitados);
        panNacionalidad.add(lblNacionalidad);
        panNacionalidad.add(jtfNacionalidad);
        JPanel panEstado = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblEstado = new JLabel("Estado           ");
            lblEstado.setForeground(colorEtiquetas);
            JTextField jtfEstado = new JTextField(20);
            jtfEstado.setDisabledTextColor(colorInhabilitados);
        panEstado.add(lblEstado);
        panEstado.add(jtfEstado);
        JPanel panDireccion = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblDireccion = new JLabel("Direccion       ");
            lblDireccion.setForeground(colorEtiquetas);
            JTextField jtfDireccion = new JTextField(20);
            jtfDireccion.setDisabledTextColor(colorInhabilitados);
        panDireccion.add(lblDireccion);
        panDireccion.add(jtfDireccion);
        JPanel panCP = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel lblCP = new JLabel("C.P.                ");
            lblCP.setForeground(colorEtiquetas);
            JTextField jtfCP = new JTextField(20);
            jtfCP.setDisabledTextColor(colorInhabilitados);
        panCP.add(lblCP);
        panCP.add(jtfCP);
        JPanel panlblObservaciones = new JPanel(new FlowLayout(FlowLayout.CENTER));
            JLabel lblObservaciones = new JLabel("Observaciones");
            lblObservaciones.setForeground(colorEtiquetas);
        panlblObservaciones.add(lblObservaciones);
        JPanel panjtaObservaciones = new JPanel(new FlowLayout(FlowLayout.CENTER));
            JTextArea jtaObservaciones = new JTextArea(5,20);
            jtaObservaciones.setDisabledTextColor(colorInhabilitados);
            JScrollPane scrollObservaciones = new JScrollPane(jtaObservaciones);
            scrollObservaciones.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);         //Barra de desplamiento vertical siempre visible
            scrollObservaciones.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);      //Barra de desplamiento horizontal nunca visible
        panjtaObservaciones.add(scrollObservaciones);

        Box boxHFichaDireccion = Box.createHorizontalBox();
        Box boxVColumna1Ficha3 = Box.createVerticalBox();
        Box boxHColumna2Ficha3 = Box.createVerticalBox();

        boxVColumna1Ficha3.add(Box.createVerticalStrut(10));
        boxVColumna1Ficha3.add(panNacionalidad);
        boxVColumna1Ficha3.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha3.add(panEstado);
        boxVColumna1Ficha3.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha3.add(panDireccion);
        boxVColumna1Ficha3.add(Box.createVerticalStrut(5));
        boxVColumna1Ficha3.add(panCP);

        boxHColumna2Ficha3.add(Box.createVerticalStrut(8));
        boxHColumna2Ficha3.add(panlblObservaciones);
        boxHColumna2Ficha3.add(panjtaObservaciones);
        JPanel panboxVColumna2Ficha3 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panboxVColumna2Ficha3.add(boxHColumna2Ficha3);

        boxHFichaDireccion.add(Box.createHorizontalStrut(10));
        boxHFichaDireccion.add(boxVColumna1Ficha3);
        boxHFichaDireccion.add(Box.createHorizontalStrut(20));
        boxHFichaDireccion.add(panboxVColumna2Ficha3);

        panFicha3.add(boxHFichaDireccion);
        ImageIcon iconoFicha3 = new ImageIcon(getClass().getResource("iconoFichaDireccion.gif"));
        jtpDatosEmpleado.addTab("Direccion", iconoFicha3, panFicha3,"Direccion del empleado");

        JPanel panFichas = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel panFichass = new JPanel(new BorderLayout());
        panFichass.add(jtpDatosEmpleado,BorderLayout.CENTER);
        boxVFichas.add(panFichass);
        panFichas.add(boxVFichas);

        Box boxHNombresYFichas = Box.createHorizontalBox();
        boxHNombresYFichas.add(Box.createHorizontalStrut(15));
        boxHNombresYFichas.add(panboxVListaNombres);
        boxHNombresYFichas.add(boxVFichas);

        Box boxHNavegacion = Box.createHorizontalBox();
        JButton btnPrimero = new JButton();
        ImageIcon iconoPrimero = new ImageIcon(getClass().getResource("icono_primero.gif"));
        btnPrimero.setIcon(iconoPrimero);
        btnPrimero.setMargin(new Insets(0, 15, 0, 15));
        JButton btnAnterior = new JButton();
        ImageIcon iconoAnterior = new ImageIcon(getClass().getResource("icono_atras.png"));
        btnAnterior.setIcon(iconoAnterior);
        btnAnterior.setMargin(new Insets(0, 20, 0,20));
        JButton btnSiguiente = new JButton();
        ImageIcon iconoSiguiente = new ImageIcon(getClass().getResource("icono_siguiente.png"));
        btnSiguiente.setIcon(iconoSiguiente);
        btnSiguiente.setMargin(new Insets(0, 20, 0, 20));
        JButton btnUltimo = new JButton();
        ImageIcon iconoUltimo = new ImageIcon(getClass().getResource("icono_ultimo.gif"));
        btnUltimo.setIcon(iconoUltimo);
        btnUltimo.setMargin(new Insets(0, 15, 0,15));
        JLabel lblContadorEmpleados = new JLabel("Empleado 3 de 10");
        lblContadorEmpleados.setFont(new Font("Arial",Font.BOLD,16));
        lblContadorEmpleados.setForeground(Color.BLUE);
        JButton btnGuardar = new JButton();
        ImageIcon iconoGuardar = new ImageIcon(getClass().getResource("icono_guardar.png"));
        btnGuardar.setIcon(iconoGuardar);
        btnGuardar.setMargin(new Insets(0, 6, 0,6));
        btnGuardar.setToolTipText("Guardar modificaciones");
        JButton btnCancelar = new JButton();
        ImageIcon iconoCancelar = new ImageIcon(getClass().getResource("Icono_cancelar.gif"));
        btnCancelar.setIcon(iconoCancelar);
        btnCancelar.setMargin(new Insets(5, 5, 5,5));
        btnCancelar.setToolTipText("Cancelar modificar");

        boxHNavegacion.add(Box.createHorizontalStrut(30));
        boxHNavegacion.add(btnPrimero);
        boxHNavegacion.add(Box.createHorizontalStrut(30));
        boxHNavegacion.add(btnAnterior);
        boxHNavegacion.add(Box.createHorizontalStrut(30));
        boxHNavegacion.add(btnSiguiente);
        boxHNavegacion.add(Box.createHorizontalStrut(30));
        boxHNavegacion.add(btnUltimo);
        boxHNavegacion.add(Box.createHorizontalStrut(30));
        boxHNavegacion.add(lblContadorEmpleados);
        boxHNavegacion.add(Box.createHorizontalStrut(40));
        boxHNavegacion.add(btnGuardar);
        boxHNavegacion.add(Box.createHorizontalStrut(30));
        boxHNavegacion.add(btnCancelar);
        JPanel panNavegacion = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panNavegacion.add(boxHNavegacion);

        //Agregamos el rotulo y luego los botones
        boxContenidoVertical.add(panRotuloPrincipal);
        boxContenidoVertical.add(Box.createVerticalStrut(5));
        boxContenidoVertical.add(panBotonesPrincipales);
        boxContenidoVertical.add(Box.createVerticalStrut(5));
        boxContenidoVertical.add(panBusquedaYNombre);
        boxContenidoVertical.add(Box.createVerticalStrut(5));
        boxContenidoVertical.add(boxHNombresYFichas);
        boxContenidoVertical.add(Box.createVerticalStrut(20));
        boxContenidoVertical.add(panNavegacion);

        //Todo el contenido del JFrame esta en un JPanel
        JPanel panContenidoVertical = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panContenidoVertical.add(boxContenidoVertical);
        add(panContenidoVertical);

    	// ########### ESCUCHADOR BOTON REGRESAR   ##########
    	ActionListener escuchadorRegresar = new ActionListener()
    	{
        	public void actionPerformed(ActionEvent evt)
        	{
				JfrPrincipal.mostrar();
				setVisible(false);
        	}
   		};
    	btnCerrarEmpleados.addActionListener(escuchadorRegresar);

// ##################### ESCUCHADOR DE VENTANA ####################################################################################
    //Para que al dar clic en la x de la esquina de este JFrame se muestre por default la ventana principal
	this.addWindowListener(new WindowAdapter() {

			public void windowClosing(WindowEvent e)
			{
				JfrPrincipal.mostrar();
				setVisible(false);
			}

			public void windowClosed(WindowEvent e)
			{
				JfrPrincipal.mostrar();
				setVisible(false);
			}
		});

    }

    public void mostrar()
    {
    	this.setLocationRelativeTo(this);	//Centramos este JFrame en la pantalla
    	setVisible(true);
    }
}

y aca los pantallazos de la ejecucion del codigo de esta clase:

Ficha Datos Laborales

Ficha Datos personales

Ficha Direccion

hasta pronto.
}