Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Java / Personalizar JTable: Problema resuelto

Personalizar JTable: Problema resuelto

Por 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

Artículos similares

Impresión de Interfaz Gráfica de Usuario

En este post veremos como imprimir secciones de un formulario en java implementando la Interface Printable. La clase que[...]

Uso de BorderPane

BorderPane es un layout que distribuye los nodos hijos en 5 posiciones TOP, LEFT, BOTTOM, RIGHT y CENTER Los nodos hijos[...]

Botones circulares de Google Plus en java

Continuación del tutorial «Google Circles en java» o.O 🙂 La Interfaz El proyecto consta de una sola interfaz la cual es[...]

Leer y Escribir registros en archivo de texto

A veces se necesita utilizar archivos de texto plano como contenedor de registros como si de una base de datos se tratar[...]

MVC: Modelo, Vista y Controlador en PHP

EL patrón MVC (Model, View, Controller) o Modelo, Vista Controlador, es un tipo de diseño que separa en capas bien defin[...]

Gestión de Stock (Parte 2)

Continuando con el desarrollo de la aplicación (Parte 1), abrimos Netbeans y creamos un nuevo proyecto al que llamaremos[...]