Mostrando entradas con la etiqueta SWING. Mostrar todas las entradas
Mostrando entradas con la etiqueta SWING. Mostrar todas las entradas

martes, 29 de noviembre de 2016

Truco Java - Establecer formato moneda en columna JTable

Hoy os voy a mostrar como poner el formato moneda (currency) en un campo de vuestra JTable.

De la misma manera que en el truco anterior, nos crearemos una clase dentro del paquete componentes de nuestra aplicación heredando de DefaultTableCellRenderer.

import java.awt.Component;
import java.text.NumberFormat;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class CurrencyCellRenderer extends DefaultTableCellRenderer {
 
    private static final NumberFormat FORMAT = NumberFormat.getCurrencyInstance();

    @Override
    public final Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        final Component result = super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, column);
        if (value instanceof Number) {
            setHorizontalAlignment(JLabel.RIGHT);
            setText(FORMAT.format(value));
        } else {
            setText("");
        }
        return result;
    }
}

La utilización es similar al caso TimestampCellRenderer:

public void LlenarTabla(JTable tablaListadoVentas, boolean inicializar) {
        DefaultTableModel modeloTabla = new DefaultTableModel (){
            @Override //Establecemos todas las celdas como no editables
            public boolean isCellEditable(int row, int column) {               
                return false;
            }            
        };
        
        tablaListadoVentas.setModel(modeloTabla);
        
        modeloTabla.addColumn("Venta");
        modeloTabla.addColumn("Id. Cliente");
        modeloTabla.addColumn("Nombre");
        modeloTabla.addColumn("Id. Empleado");
        modeloTabla.addColumn("Nombre");
        modeloTabla.addColumn("Fecha y hora");
        modeloTabla.addColumn("Nº Artículos");
        modeloTabla.addColumn("Importe Total");                        
        
        Object[] columna = new Object[8];       
        
        tablaListadoVentas.getColumnModel().getColumn(5).setCellRenderer(new TimestampCellRenderer());
        tablaListadoVentas.getColumnModel().getColumn(7).setCellRenderer(new CurrencyCellRenderer());


Si tienes cualquier duda o comentario recuerda que puedes exponerlo aquí o bien mediante nuestro twitter y facebook.
Compartir:

jueves, 3 de noviembre de 2016

Truco Java - Establecer formato fecha y hora en columna JTable

El truco que os traigo hoy es producto de una necesidad que me surgió durante la elaboración del proyecto del curso de Java que estoy haciendo. La necesidad vino cuando necesité establecer formato fecha/hora a un campo de un JTable que contenia un valor Timestamp obtenido de MySQL.



Lo que tenemos que hacer es crearnos una clase (en mi caso estas clases las meto siempre en un paquete llamado "componentes" para tenerlo todo organizado) que herede de DefaultTableCellRenderer y posteriormente utilizarla en nuestra columna de JTable.

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.swing.table.DefaultTableCellRenderer;

public class TimestampCellRenderer extends DefaultTableCellRenderer {

    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

    public TimestampCellRenderer() {
        super();
    }

    public void setValue(Object value) {
        if (formatter == null) {
            formatter = DateFormat.getDateInstance();
        }
        setText((value == null) ? "" : formatter.format(value));
    }
}


En la linea SimpleDateFormat podemos establecer el formato de fecha y hora que nosotros necesitemos. Se me ocurre como mejora añadir un parametro al constructor para poder pasar la cadena de formato por ejemplo.

La utilización es sencilla: Suponiendo que nuestro JTable se llame tablaListadoVentas y una vez establecido el modelo de la misma:

    public void LlenarTabla(JTable tablaListadoVentas, boolean inicializar) {
        DefaultTableModel modeloTabla = new DefaultTableModel (){
            @Override //Establecemos todas las celdas como no editables
            public boolean isCellEditable(int row, int column) {               
                return false;
            }            
        };
        
        tablaListadoVentas.setModel(modeloTabla);
        
        modeloTabla.addColumn("Venta");
        modeloTabla.addColumn("Id. Cliente");
        modeloTabla.addColumn("Nombre");
        modeloTabla.addColumn("Id. Empleado");
        modeloTabla.addColumn("Nombre");
        modeloTabla.addColumn("Fecha y hora");
        modeloTabla.addColumn("Nº Artículos");
        modeloTabla.addColumn("Importe Total");                        
        
        Object[] columna = new Object[8];       
        
        tablaListadoVentas.getColumnModel().getColumn(5).setCellRenderer(new TimestampCellRenderer());



Si tienes cualquier duda o comentario recuerda que puedes exponerlo aquí o bien mediante nuestro twitter y facebook.
Compartir:

viernes, 17 de junio de 2016

Truco Java - Añadir imágenes a un JTable desde un campo Blob en MySQL

Hoy hemos realizado una encuesta a través del twitter del blog preguntandoos sobre que lenguaje queríais el siguiente truco y ha ganado JAVA.

Por suerte estoy realizando un master de JAVA ahora mismo y a diario me surgen problemas y dudas que voy solventando y que, seguramente, sean las mismas que tengáis vosotros si estáis empezando con este lenguaje.

En el truco que nos ocupa hoy os voy a enseñar cómo solucioné la cuestión de mostrar un campo de imagen (tipo BLOB en MySQL) en un JTable.


Os pondré el código que rellena la tabla y luego os destacaré un par de secciones que son las que considero más importantes.

Este es el código en cuestión:

    /**
     * Procedimiento LlenarTabla
     * Utilizando el procedimiento modeloImagen.listImagen,
     * se rellena la tabla pasada por parametro.
     * @param tablaImagenes
     * @throws java.sql.SQLException
     * @throws java.io.IOException
     */
    public void LlenarTabla(JTable tablaImagenes) throws SQLException, IOException{
        DefaultTableModel modeloTabla = new DefaultTableModel() {
            @Override //Redefinimos el método getColumnClass
            public Class getColumnClass(int column){
                switch(column) {
                    case 0: return Object.class;
                    case 1: return Object.class;
                    case 2: return Object.class;
                    case 3: return ImageIcon.class;
                    default: return Object.class;
                }
            }
        };
        //Establecemos el modelo correspondiente en la JTable
        tablaImagenes.setModel(modeloTabla);
        
        //Añadimos las columnas correspondientes
        modeloTabla.addColumn("ID IMAGEN");
        modeloTabla.addColumn("ES CATEGORIA");
        modeloTabla.addColumn("DESCRIPCION");
        modeloTabla.addColumn("IMAGEN"); //Esta es la columna [3], es la que
                                         //nos interesa que sea una imagen.
                
        Object[] columna = new Object[4];
        
        ArrayList<imagen> listaImagenes = modeloImagenes.ListarImagenXEsCategoria("","");
        
        int numRegistros = listaImagenes.size();
        
        for (int i = 0; i < numRegistros; i++) {
            columna[0] = listaImagenes.get(i).getIdImagen();
            columna[1] = listaImagenes.get(i).getEsCategoria();
            columna[2] = listaImagenes.get(i).getDescripcion(); 

            //Transformamos el campo blob en ImageIcon
            Blob blob = listaImagenes.get(i).getImagen();
            int blobLength = (int) blob.length();  
            byte[] bytes = blob.getBytes(1, blobLength);
            blob.free();
            BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes));
            ImageIcon icon = new ImageIcon(img); 
            
            //Añadimos la imagen a la columna correspondiente
            columna[3] = icon;
            
            //Añadimos la fila al modelo
            modeloTabla.addRow(columna);
            
            //Establecemos el alto de la fila                                   
            tablaImagenes.setRowHeight(i, icon.getIconHeight());    
        }
        
   } 



No voy a entrar en el detalle de cómo recupero los datos de MySQL ni de cómo se define la clase Imagen (si queréis el código podéis pedírmelo en los comentarios y os lo facilitaré), pero sí quiero que prestéis atención a este código:

         DefaultTableModel modeloTabla = new DefaultTableModel() {
            @Override //Redefinimos el método getColumnClass
            public Class getColumnClass(int column){
                switch(column) {
                    case 0: return Object.class;
                    case 1: return Object.class;
                    case 2: return Object.class;
                    case 3: return ImageIcon.class;
                    default: return Object.class;
                }
            }
        };


Ese fragmento de código define el modelo que utilizará el objeto JTable y sobre el hemos de redefinir el método getColumnClass para que, en la columna [3] nos devuelva un ImageIcon, que es lo que queremos mostrar.

Otra parte importante del código, y que seguro que muchos ya conocéis, es el encargado de convertir el campo BLOB en un ImageIcon.
  
            //Transformamos el campo blob en ImageIcon
            Blob blob = listaImagenes.get(i).getImagen();
            int blobLength = (int) blob.length();  
            byte[] bytes = blob.getBytes(1, blobLength);
            blob.free();
            BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes));
            ImageIcon icon = new ImageIcon(img); 
            

Con estos sencillos pasos podemos obtener el resultado deseado.

Resultado final en una aplicación SWING

Si tienes cualquier duda o comentario recuerda que puedes exponerlo aquí o bien mediante nuestro twitter y facebook.
Compartir:
Con la tecnología de Blogger.

BoosterBlog

BoosterBlog
BoosterBlog

Timeline Twitter

Seguidores

Seguidores