Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Personalizar JTable: Problema resuelto

Personalizar JTable: Problema resuelto

Autor jc mouse miércoles, junio 11, 2014

En este post se da respuesta a una pregunta realizada por facebook.

El problema dice así:

Se quiere personalizar un JTable para que cumpla las siguientes restricciones:

– Se debe ingresar solamente datos numéricos en una de las columnas y que sean enteros  no menor o igual a cero.

– Cuando se ingrese un nuevo valor (Enter) se debe sumar ese valor y el de otra columna y colocar el total en una tercera columna.

matrix

Solucion

Para dar solución a este problema se hace uso de tres clases:

TModelListener.java: Esta clase que implementa a TableModelListener, se encarga de escuchar los cambios que ocurren en el modelo del JTable y llevar a cabo tanto la suma de las columnas y el control de las restricciones planteadas en el problema.

TModel.java:  esta clase que se extiende de un DefaultTableModel nos ayuda a personalizar los tipos de datos que tendrá permitido aceptar el JTable (string, entero, entero, entero) ademas de restringir la editabilidad de algunas celdas, en este problemas todas las celdas de las columnas 1,3,4

– CellRenderer.java: esta clase nos permite cambiar el aspecto gráfico del Jtable, en este caso pintara las celdas de la columna 2 de verde si estas contiene un numero entero,de color rojo si se tratode ingresar un valor no valido.

el código de las clases a continuación:

– TModelListener.java:

import javax.swing.JOptionPane;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 */
public class TModelListener implements TableModelListener  {

    /**
 * @param e TableModelEvent
 */
    public void ajuste( TableModelEvent e ){

        //solo si se edita la tabla
        if ( e.getType() == TableModelEvent.UPDATE ) {

            //se obtiene el modelo
            TableModel modelo = ( (TableModel) ( e.getSource() ) );            
            int fila = e.getFirstRow();
            int columna = e.getColumn();
            if ( columna == 3 ) {return;}

             try {                
                 //obtiene valor de celda editable
                int a = ((Number) modelo.getValueAt(fila,columna)).intValue();
                //obtiene valor de celda no editable
                int b = ((Number) modelo.getValueAt(fila,columna+1)).intValue();

                //restricción
                if( a <= 0){
                   JOptionPane.showMessageDialog( null , "Error: El valor debe ser enterio positivo.");
                   modelo.setValueAt( null , fila, columna); 
                   modelo.setValueAt( null , fila, columna+2); 
                   return;
                }

                modelo.setValueAt( a + b , fila, columna+2);

            } catch (NullPointerException ex) { /*...*/ }             
        }
    }

    @Override
    public void tableChanged(TableModelEvent e) {
        ajuste( e );
    }

}

– TModel.java:

import javax.swing.table.DefaultTableModel;
/**
 * @web http://jc-mouse.net/
 * @author Mouse
 */
public class TModel extends DefaultTableModel{
    Class[] types = new Class [] {
                java.lang.Object.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class
            };
    boolean[] canEdit = new boolean [] {
                false, true, false, false
            };

    public TModel(){
        //unos valores por default 🙂
         super( new Object[][] { { "Producto A", 23, 21, (23+21) }, 
                                 { "Producto B", 112, 2, (112+2) },
                                 { "Producto C", 22, 1, (22+1) },
                                 { "Producto D", 544, 2, (544+2) },
                                 { "Producto E", 12, 3, (12+3) }
                               },
         new String[] { "Producto", "Valor editable", "Valor Fijo","Total" });         

    }

    @Override
    public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
          return canEdit [columnIndex];
    }
}

– CellRenderer.java:

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
/**
 * @web http://jc-mouse.net/
 * @author Mouse
 */
public class CellRenderer extends DefaultTableCellRenderer{
    private Font bold = new Font( "Arial",Font.BOLD ,12 );

    @Override
    public Component getTableCellRendererComponent ( JTable table, Object value, boolean selected, boolean focused, int row, int column )
    {

        if( value == null )
        {
            this.setBackground( new Color(255,0,0) );
            this.setText( null );

        }else
        {
            this.setText( "" + Integer.valueOf( value.toString() ) );    
            this.setBackground( new Color(0,255,0) );
        }

        this.setForeground( (selected)? new Color(0,0,255):new Color(0,110,10) );            
        this.setFont(bold);            
        return this;
    }
}

kawaii tabli

Proyecto completo AQUI 🙂

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Conversor decimal a binario

Conversor decimal a binario

Desde que Google anuncio de que dejara de dar soporte al plugin de Eclipse y se concentrara en Android Studio, quienes t...

Impresión de reportes

Impresión de reportes

Existen diferentes métodos par imprimir reportes hechos con JasperReport en aplicaciones hechas en java, en este post te...

Evaluar expresiones matemáticas en Java con JavaScript

Evaluar expresiones matemáticas en Java con JavaScript

Java 8 trae consigo una nueva versión del motor de JavaScript llamada Nashorn, este motor introduce mejoras de rendimien...

Primeros pasos en Jaspersoft Studio

Primeros pasos en Jaspersoft Studio

¿Que es Jaspersoft Studio? Jaspersoft Studio es el nuevo diseñador de informes basado en Eclipse para JasperReports y Ja...

Puzzle en Visual Basic [Código Fuente]

Puzzle en Visual Basic [Código Fuente]

Rompecabezas 3×3 realizado en Visual Basic .NET, lo que se hizo fue una migración de un proyecto hecho en java (pue...

Reconocimiento Óptico de Caracteres con Tess4J

Reconocimiento Óptico de Caracteres con Tess4J

El reconocimiento óptico de caracteres o OCR (Optical Character Recognition), es un proceso dirigido a la digitalización...

2 comentarios en “Personalizar JTable: Problema resuelto”

  1. jesores dice:

    Me fue de mucha utilidad, gracias por compartir el camino a seguir.

  2. Alfredo dice:

    Q tal hermano, un gran aporte me sirvio,una pregunta si quiero personalizar cada celda con un componete swing ¿Podrias dar un ejemplo de ese caso tmb? gracias de antemano

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

Si trabajas con redes sociales (RRSS) a continuación te muestro tres herramintas gratuitas que te ayudaran a la hora de...

Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...

En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...

Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...

Herramientas

Generador de Enlaces a Whatsapp