OZ Ejemplo Cajero ATM

¿Que vamos a desarrollar?

Una aplicación que simule el funcionamiento de un cajero automático, mostrando el uso de múltiples frameworks Java para crear un sistema modular y extendible.

Requisitos

  • Apache Maven >= 3.X
  • Java JDK >=  1.6
  • Netbeans >= 6.5
  • Base de Datos MySQL

Análisis

Supongamos que tenemos el siguiente requerimiento por parte del cliente o del analista:

Crear un cajero que permita realizar dos operaciones, Retirar efectivo y hacer Transferencias a otro Banco.

Veamos como se vería en un diagrama de casos de uso:

El usuario unicamente va a realizar dos operaciones retiro y transferencia.

Bien ahora la base de datos, vamos a utilizar este script para generarla.  Ejecutas el archivo en tu gestor favorito y te  creará el esquema llamado OZ_TEST, con las siguiente tablas:

Seguir leyendo

Manejador de base de datos Squirrel

Para realizar consultas a bases de datos existen multiples herramientas en el mercado, por lo general probamos las distribuciones oficiales de los fabricantes (sql devloper, mysql query browser) y de ahí software de terceros (Toad, DB visualizer, etc..)

Pero esta vez me llamo la atencion Squirrel en especial porque esta pensada para desarrollo con Java, ya que soporta consultas en HQL y además te deja configurar tu conexión con el archivo de hibernate y utilizar tus pojos.

Me agrado bastante, tiene buenas características y creo que puede ser muy útil sobre todo por ser multiplataforma (se ejecuta con la máquina virtual de Java).

Referencias:

http://squirrel-sql.sourceforge.net/

Saludos

java + compiz fusion en ubuntu

Hace tiempo que que en mi trabajo he probado una aplicación con Swing/JNLP, pero por alguna razon al abrir la aplicación no se veia nada dentro de la ventana :S…. investigando un poco parece que hay un problemilla con las animaciones de compiz fusión y java.

Y por si fuera poco me pasaba lo mismo con todas mis aplicaciones java y en algunos casos se perdian los efectos de escritorio completamente, pero bueno el mejor camino que pude encontrar para arreglarlo fue el desactivar las animaciones de compiz para java, en especial en los popups y en los menus que es donde creo yo que esta la causa del conflicto.

Para corregirlo hay que hacer lo siguiente:

1. Abres la ventana de preferencias de compiz y selecciona Animaciones

2. En la pestaña Abrir animación hay un boton que dice “Nuevo“, al darle clic se abre un cuadro de diaolo donde podemos especificar el tipo de ventana que vamos a configurar.

3. Dejamos los valores por defecto (“Ninguno”) y en la opcion que dice Coincidir efecto escribimos lo siguiente:

(name=sun-awt-X11-XFramePeer | name=sun-awt-X11-XDialogPeer |-swing_JDialog)

4. Le das clic en cerrar y repetimos lo mismo en la pestaña de Animación de cerrado, pero con el siguiente texto:

( name=sun-awt-X11-XFramePeer | name=sun-awt-X11-XDialogPeer)

5. Cierras las preferencias y reinicias tu sesion, y listo las ventanas con java ya ejecutan correctamente n_n.

Se ven un poco feas sin los efectos pero prefiero eso a estar recargando el compiz fusion =P.

Espero que sirva, Saludos

Imprimir JPanel/JFrame a escala en Java

Bueno aqui va una adaptación de la primera versión para imprimr un JPanel / JFrame a escala:

  1. Implementar la interfaz Printable en la clase que contiene el JPanel/JFrame que deseamos imprimir:
     public class PrintJFrameScaled extends javax.swing.JFrame implements Printable 
  2. Sobreescribir el método print en la clase que queremos imprimir:
        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
    
            if (pageIndex > 0)
              return NO_SUCH_PAGE;
    
            Graphics2D g2d = (Graphics2D)graphics;
            g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
    
            // set dimension to scale panel to print
            g2d.scale( ((Number) campo_escala.getValue()).doubleValue()
                    , ((Number) campo_escala.getValue()).doubleValue());
    
            jPanel1.printAll(graphics);
    
            return PAGE_EXISTS;
        }
    

    Como se puede ver el método scale(X,Y) del objeto g2d es el que realiza el trabajo, recibe como parámetros dos valores de tipo Double que representan la escala para el alto (X) y el ancho (Y), por ejemplo el 1.00 equivale al 100%.

    100% == 1.00
    80% == 0.80

    Para imprimir panel en una escala del 70% se tienen que utilizar los siguientes valores:

    g2d.scale(0.70,0.70);
    
  3. Y para ejecutar la impresión utilizas las siguientes líneas de código:
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
            try {
    
                // Open printer dialog and pass JPanel to print
                    PrinterJob job = PrinterJob.getPrinterJob();
                    job.setPrintable(this);
    
                    if(job.printDialog()) job.print();
    
            } catch (PrinterException ex) {
                Logger.getLogger(PrintJFrameScaled.class.getName()).log(Level.SEVERE, null, ex);
            }
    
        }
    

Aquí la captura del ejemplo con el código.

Actualización 12/04/2017, he recuperado el código de un respaldo y he creado un repositorio en github:

https://github.com/jaehoo/oz-ex-swing/blob/master/src/main/java/org/oz/swing/examples/jpanel/PrintJFrameScaled.java

Saludos

Imprimir JPanel/JFrame – Print JPanel/JFrame Java

Para realizar las impresiones en Swing es necesario utilizar la interface Printable en el objeto que queremos imprimir.

implements Printable

Se debe sobreescribir el método print(), abajo le pasamos el comoponente que deseamos imprimir que en este caso es un JPanel (pero tambien podemos enviarle el comoponente que querramos :


public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {

if (pageIndex > 0) { /* We have only one page, and 'page' is zero-based */
  return NO_SUCH_PAGE;
}

Graphics2D g2d = (Graphics2D)graphics;
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

jPanel1.printAll(graphics);

return PAGE_EXISTS;

}

Y por último mandar a ejecutar la impresión:

        try {
  PrinterJob job = PrinterJob.getPrinterJob();
  job.setPrintable(this);
  job.printDialog();
  job.print();
} catch (PrinterException ex) {
  Logger.getLogger(PrintMe.class.getName()).log(Level.SEVERE, null, ex);
}

Agrego el código fuente.
Source Code

Ver demo:

Launches the ComboBoxDemo2 example

Saludos =P

Capturar teclas en Swing/ Keys Capture in Swing

Para capturar las combinaciones de teclas dentro de una aplicación swing,  se deben de utilizar dos  objetos (ActionMap e  InputMap ).

1. Creamos nuestro Mapa de accion.

ActionMap mapaAccion = jPanel1.getActionMap();

2. Indicamos el componente donde queremos que trabaje el mapa.

InputMap map = jPanel1.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);

3. Seleccionamos la combinación de teclas.

//F1
KeyStroke key_F1 = KeyStroke.getKeyStroke(KeyEvent.VK_F1,0);

// CTRL + O
KeyStroke ctrl_O = KeyStroke.getKeyStroke(KeyEvent.VK_O,Event.CTRL_MASK);

// CTRL + C, CTRL + V
KeyStroke ctrl_C = KeyStroke.getKeyStroke(KeyEvent.VK_C,Event.CTRL_MASK, true);
KeyStroke ctrl_V = KeyStroke.getKeyStroke(KeyEvent.VK_V,Event.CTRL_MASK, true);


4. Indicamos y agregamos la acción a ejecutar.

//Key Actions
map.put(key_F1, “accion_F1”);
mapaAccion.put(“accion_F1”,Accion_F1());


public AbstractAction Accion_F1(){
return new AbstractAction() { public void actionPerformed(ActionEvent e) { imprimir(“F1”); } };
}

public void imprimir(String cadena){
System.out.println(“Accion :”+ cadena);
jTextField1.setText(cadena);
}

Aqui el ejemplo:

// ACCIONES
public void mapeoTeclas(){

ActionMap mapaAccion = jPanel1.getActionMap();
InputMap map = jPanel1.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);

//F1
KeyStroke key_F1 = KeyStroke.getKeyStroke(KeyEvent.VK_F1,0);

// CTRL + O
KeyStroke ctrl_O = KeyStroke.getKeyStroke(KeyEvent.VK_O,Event.CTRL_MASK);

// CTRL + C, CTRL + V
KeyStroke ctrl_C = KeyStroke.getKeyStroke(KeyEvent.VK_C,Event.CTRL_MASK, true);
KeyStroke ctrl_V = KeyStroke.getKeyStroke(KeyEvent.VK_V,Event.CTRL_MASK, true);

//Key Actions
map.put(key_F1, “accion_F1”);
mapaAccion.put(“accion_F1”,Accion_F1());

map.put(ctrl_O , “accion_ctrl_o”);
mapaAccion.put(“accion_ctrl_o”,Accion_CTRLO());

map.put(ctrl_C , “accion_ctrl_C”);
mapaAccion.put(“accion_ctrl_C”,Accion_CTRLC());

map.put(ctrl_V , “accion_ctrl_V”);
mapaAccion.put(“accion_ctrl_V”,Accion_CTRLV());
}

public AbstractAction Accion_CTRLO(){
return new AbstractAction() { public void actionPerformed(ActionEvent e) { imprimir(“CTRL + O”); } };
}

public AbstractAction Accion_CTRLC(){
return new AbstractAction() { public void actionPerformed(ActionEvent e) { imprimir(“CTRL + C”); } };
}

public AbstractAction Accion_CTRLV(){
return new AbstractAction() { public void actionPerformed(ActionEvent e) { imprimir(“CTRL + V”); } };
}

public AbstractAction Accion_F1(){
return new AbstractAction() { public void actionPerformed(ActionEvent e) { imprimir(“F1”); } };
}

public void imprimir(String cadena){
System.out.println(“Accion :”+ cadena);
jTextField1.setText(cadena);
}

Solo hay que ejecutar el metodo mapeoTeclas() en el constructor de la clase.

Agrego el codigo fuente:

Source

Source

Saludos

Desactivar Copy/Paste JTextField

Para desactivar los eventos de teclado en una caja de texto se deben capturar las combinaciones de teclas mediante un InputMap, se define la combinación Ctrl+c y Ctrl+V de la siguiente forma;

// BLOQUEA LA ACCION COPIAR 
      InputMap map2 = jTextField4.getInputMap(jTextField4.WHEN_FOCUSED);
      map2.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK), "null");

Nota: El elemento jTextField4 es mi caja de texto.

Estás lineas de código deben ser aplicadas DESPUÉS de que tus componentes hayan sido inicializados, es decir después de ejecutar el constructor de la clase (en netbeans yo lo hago despues del método initComponents()), o al abrir el frame, o lo puedes colocar en alguna acción como un boton, menu, etc… no importa donde lo coloques solo asegurate que tus componentes ya están inicializados.

Además esto puede aplicar para cualquier componente que herede de las siguientes clases:

  • javax.swing.JComponent
  • java.awt.Component

Y así puedes desactivar los eventos para varios componentes, aquí dejo los ejemplos con las aportaciones que han dejado:

 public void disablePasteAction(JComponent[] components){

        for (JComponent campo : components){
            InputMap map = campo.getInputMap();
            map.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK), "null");
            map.put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, Event.SHIFT_MASK), "null");
        }

    }

    public void disableCopyAction(Component[] components){

        for (Component campo : components){

            if(campo instanceof JComponent){
                InputMap map = ((JComponent)campo).getInputMap();
                map.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK), "null");
            }
        }
    }

 // por ejemplo lo puedes invocar de esta forma:
        Component[] components =jPanel1.getComponents();
        disableCopyAction(components);
        disablePasteAction((JComponent[])components);

Saludos