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

标签 java jtable tablecellrenderer tablemodel abstracttablemodel

我正在 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;
    }

}

产品类是这样的:

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

关于java - 如何为 JTable 上的最小值单元格着色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51791684/

相关文章:

java - 根据数据类型具有不同类型单元格的 Jtable

java - 如何在 DefaultTableModel/JTable 中合并单元格?

java - 如何更改每一行的背景颜色?

java - 与 Firefox 数据库管理器相比,JDBC SELECT 非常慢

Java:如何使用一个 mouseListener 中的对象到另一个类?

java - 如何使用 java 中的 XMLEndcoder 在 xml 文件中编写包含数据的 JTable 状态

java - 如何将多个 jComponent 插入到 jTable 的单元格中

java - 如何在java中读取文本文件的特定部分

java - 同一集群上的多个 Kafka 版本

java - 在 Java 中解码字符 : why is it faster with a reader than using buffers?