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.
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;
}
};