如何为 JTable 上的最小值单元格着色?

how color the minimum value cell on JTable?

我正在 Java 上开发一个小应用程序。我为 jtable 创建了一个自定义模型。型号是这样的:

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

}

class 产品是这样的:

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



}

我需要用每行的最小值给单元格上色,其他值用绿色和灰色。我不知道如何编写 getTableCellRendererComponent 方法,有人可以帮助我吗? 对不起,如果我的英语不好,我是西班牙人。 谢谢。

要获得您正在寻找的结果,您可以覆盖 JTable prepareRenderer 方法。 请参考下面的代码。这只是示例代码,不遵循 java 编码标准。 把那个工作留给你:)

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