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