javajtabletablecellrenderertablemodelabstracttablemodel

how color the minimum value cell on JTable?


I am developing a small application on Java. I created a custom model for jtable. The model is this:

package tienda.funcionalidad;

import java.awt.Component;
import java.util.ArrayList;

import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;

import tienda.funcionalidad.excepciones.NombreNoValidoException;
import tienda.funcionalidad.excepciones.PrecioNoValidoException;
import tienda.funcionalidad.excepciones.ProductoNoExisteException;

public class ProductTableModel extends AbstractTableModel implements TableCellRenderer {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    final String[] columns = { "Producto", "Serodys", "Ramírez", "Entrada", "MercaSur" };
    final ArrayList registros = GestionTienda.getProductos();

    @Override
    public int getColumnCount() {
        return columns.length;
    }

    @Override
    public String getColumnName(int column) {
        return columns[column];
    }

    @Override
    public int getRowCount() {
        if (registros.isEmpty())
            return 0;
        return registros.size();
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Product product = (Product) registros.get(rowIndex);
        switch (columnIndex) {
        case 0:
            return product.getName();
        case 1:
            return product.getPriceSerodys();
        case 2:
            return product.getPriceRamirez();
        case 3:
            return product.getPriceEntrada();
        case 4:
            return product.getPriceMercasur();
        }
        return null;
    }

    public boolean isCellEditable(int row, int col) {
        return true;
    }

    public Class getColumnClass(int col) {
        switch (col) {
        case 0: // Name
            return String.class;
        case 1: // value
            return Double.class;
        case 2: // location
            return Double.class;
        case 3: // quantity
            return Double.class;
        case 4:
            return Double.class;
        }
        return null;
    }

    public void setValueAt(Object value, int row, int col) {
        try {
            Product product = (Product) registros.get(row);
            switch (col) {
            case 0: // Name
                product.setName(value.toString());
                break;
            case 1: // value
                Double priceSerodys = (Double) value;
                product.setPriceSerodys(priceSerodys);
                break;
            case 2: // location
                Double priceRamirez = (Double) value;
                product.setPriceRamirez(priceRamirez);
                break;
            case 3: // quantity
                Double priceEntrada = (Double) value;
                product.setPriceEntrada(priceEntrada);
                break;
            case 4: // quantity
                Double priceMercasur = (Double) value;
                product.setPriceMercasur(priceMercasur);
                break;
            }
        } catch (NombreNoValidoException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (PrecioNoValidoException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4,
            int arg5) {

        return null;
    }

}

And the class Product is this:

package tienda.funcionalidad;

import java.io.Serializable;

import tienda.funcionalidad.excepciones.NombreNoValidoException;
import tienda.funcionalidad.excepciones.PrecioNoValidoException;

public class Product implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int id;
    private String name;
    private double priceSerodys;
    private double priceRamirez;
    private double priceEntrada;
    private double priceMercasur;
    private double priceAux = 0;


    public Product(int id,String name, double priceSerodys, double priceRamirez, double priceEntrada, double priceMercasur) throws PrecioNoValidoException, NombreNoValidoException {       
        setName(name);
        setPriceSerodys(priceSerodys);
        setPriceRamirez(priceRamirez);
        setPriceEntrada(priceEntrada);
        setPriceMercasur(priceMercasur);
        setId(id);
    }

    public Product(int id,String nombre) throws NombreNoValidoException {       
        setName(nombre);
        setId(id);
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    protected void setPriceSerodys(Double priceSerodys) throws PrecioNoValidoException {
        if(priceSerodys<0)
            throw new PrecioNoValidoException("Debes introducir un precio superior a 0");
        this.priceSerodys=priceSerodys;
    }

    public double getPriceSerodys() {
        return priceSerodys;
    }

    protected void setPriceRamirez(Double priceRamirez) throws PrecioNoValidoException {
        if(priceRamirez<0)
            throw new PrecioNoValidoException("Debes introducir un precio superior a 0");
        this.priceRamirez=priceRamirez;
    }

    public double getPriceRamirez() {
        return priceRamirez;
    }

    protected void setPriceEntrada(Double priceEntrada) throws PrecioNoValidoException {
        if(priceEntrada<0)
            throw new PrecioNoValidoException("Debes introducir un precio superior a 0");
        this.priceEntrada=priceEntrada;
    }

    public double getPriceEntrada() {
        return priceEntrada;
    }

    protected void setPriceMercasur(Double priceMercasur) throws PrecioNoValidoException {
        if(priceMercasur<0)
            throw new PrecioNoValidoException("Debes introducir un precio superior a 0");
        this.priceMercasur=priceMercasur;
    }

    public double getPriceMercasur() {
        return priceMercasur;
    }

    protected void setName(String nombre) throws NombreNoValidoException {
        if(nombre.equals("") || nombre==null)
            throw new NombreNoValidoException("Debes introducir un nombre para el producto");
        this.name=nombre;
    }

    public String getName() {
        return name;
    }

    public double getPrecio() {
        return priceSerodys;
    }

    @Override
    public String toString() {  
        return getName();
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Product other = (Product) obj;
        if (name == null) {
            if (other.name != null) {
                return false;
            }
        } else if (!name.equals(other.name)) {
            return false;
        }
        return true;
    }



}

I need color the cell with the minimun value of each row with green and grey the other values. I am not idea how i have to codify the method getTableCellRendererComponent, can someone help me? Sorry if my english is bad, i am spanish. Thank you.


Solution

  • To achieve the result your are looking for, you can override the JTable prepareRenderer method. Please refer the code below. This is just an example code and doesn't follow the java coding standard. Left that work for you :)

       JTable table = new JTable(new ProductTableModel()){
            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int rowIndex,
                    int columnIndex) {
    
                JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex);  
    
                int columnCount = getColumnCount();
    
                if(columnIndex != 0){
    
                    double firstVal = Double.parseDouble(getValueAt(rowIndex, 1).toString());
                    for (int i = 2; i < columnCount; i++) {
                        Double cellValue = Double.valueOf(getValueAt(rowIndex, i).toString());
                        if(cellValue < firstVal ){
                            firstVal = cellValue;
                        }
                    }                    
    
                    if(firstVal == Double.valueOf(getValueAt(rowIndex, columnIndex).toString()).doubleValue()) {
                        component.setBackground(Color.GREEN);
                    } else{
                        component.setBackground(Color.GRAY);
                    }
                }
    
                return component;
            }
        };