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.
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; } }
Proyecto completo AQUI 🙂
Problema: Desarrollar un juego en consola con Kotlin que genere un numero aleatorio entre un rango preestablecido y perm[...]
Hola 🙂 en esta ocasión un amigo del Brasil nos envía un proyecto java de una Urna Electrónica o Voto Electronico, desarr[...]
Entre los correos y mensajes en facebook y whatsapp que me llegan (y de entrada pido perdón a quienes no puedo responder[...]
A veces navegando en la internet buscando novedades , investigando o simplemente perdiendo el tiempo 🙂 se encuentran cos[...]
Los mejores días del marco de java swing se han ido. Las aplicaciones de escritorio perdieron popularidad y todo está fo[...]
En esta oportunidad dejamos las fuentes del Generador de Código de Control de Impuestos Bolivia (Facturación Virtual), e[...]