【问题标题】:how color the minimum value cell on JTable?JTable上的最小值单元格如何着色?
【发布时间】:2019-01-18 08:59:56
【问题描述】:

我正在开发一个基于 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;
    }

}

Product 类是这样的:

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,有人可以帮我吗? 对不起,如果我的英语不好,我是西班牙人。 谢谢。

【问题讨论】:

    标签: java jtable tablecellrenderer tablemodel abstracttablemodel


    【解决方案1】:

    要实现您正在寻找的结果,您可以覆盖 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;
            }
        };
    

    【讨论】:

    • Tkan 你们这些人,这段代码很有用。现在,我尝试在我的代码中编写代码。
    猜你喜欢
    • 2013-03-14
    • 2015-08-13
    • 2013-06-30
    • 1970-01-01
    • 2013-04-09
    • 2023-04-04
    • 2018-04-19
    • 1970-01-01
    • 2022-12-08
    相关资源
    最近更新 更多