Mudar cor da celula com base em comparação entre dois valores

meu codigo esta abaixo, ele pega o resultado de uma consulta ao banco de dados e mostra os valores, se eu mando comparar o valor de value com uma constante, da certo, dependendo do numero a cor fica como eu quero. Mas se eu comparo value com uma variavel, ele pega apenas o ultimo numero da lista em q esta a variavel para comparar.
Se alguem puder me ajudar eu agradeço.

package asj;

import DAO.DAOvendedor;
import static asj.ControleEstoque.QTD;
import java.awt.Color;
import java.awt.Component;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import logica.listarprodutos;

public class ControleEstoque extends javax.swing.JFrame {

    public int cor;
    public static int qtdminima, QTD;
    //   Vermelho ver = new Vermelho();

    public ControleEstoque() throws SQLException {
        initComponents();
        CarregaVendedor();

    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        formatarPreco1 = new Util.FormatarPreco();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jCvendedor = new javax.swing.JComboBox<>();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTtabela = new javax.swing.JTable();
        jBBuscar = new javax.swing.JButton();

        formatarPreco1.setText("formatarPreco1");

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Controle de Estoque");

        jLabel1.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
        jLabel1.setText("Controle de Estoque");

        jLabel2.setText("Selecione Empresa");

        jTtabela.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "ID", "Produto", "Preço Compra", "Qtd.", "Qtd. Minima"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTtabela.getTableHeader().setReorderingAllowed(false);
        jScrollPane1.setViewportView(jTtabela);
        if (jTtabela.getColumnModel().getColumnCount() > 0) {
            jTtabela.getColumnModel().getColumn(0).setResizable(false);
            jTtabela.getColumnModel().getColumn(0).setPreferredWidth(5);
            jTtabela.getColumnModel().getColumn(1).setResizable(false);
            jTtabela.getColumnModel().getColumn(1).setPreferredWidth(150);
            jTtabela.getColumnModel().getColumn(2).setResizable(false);
            jTtabela.getColumnModel().getColumn(2).setPreferredWidth(15);
            jTtabela.getColumnModel().getColumn(2).setCellRenderer(formatarPreco1);
            jTtabela.getColumnModel().getColumn(3).setResizable(false);
            jTtabela.getColumnModel().getColumn(3).setPreferredWidth(5);
            jTtabela.getColumnModel().getColumn(4).setResizable(false);
            jTtabela.getColumnModel().getColumn(4).setPreferredWidth(5);
        }

        jBBuscar.setBackground(new java.awt.Color(0, 255, 0));
        jBBuscar.setText("Buscar");
        jBBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBBuscarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLabel1)
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                .addGroup(jPanel1Layout.createSequentialGroup()
                    .addComponent(jLabel2)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jCvendedor, javax.swing.GroupLayout.PREFERRED_SIZE, 501, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jBBuscar))
                .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 761, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jCvendedor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jBBuscar))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 11, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 60, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void jBBuscarActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {
            DAOvendedor dao = new DAOvendedor();
            DefaultTableModel model = (DefaultTableModel) jTtabela.getModel();
            model.setRowCount(0);
            for (listarprodutos p : dao.EstoquexVendedor((String) jCvendedor.getSelectedItem())) {
                model.addRow(new Object[]{p.getId(), p.getProduto(), p.getPrecocompra(), p.getQtd(), p.getQtdmin()});
                qtdminima = p.getQtdmin();
                QTD = p.getQtd();
                
                jTtabela.getColumnModel().getColumn(4).setCellRenderer(new Vermelho());
            }
        } catch (SQLException ex) {
            Logger.getLogger(ControleEstoque.class.getName()).log(Level.SEVERE, null, ex);
        }

    }                                        

    public static void main(String args[]) {

        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ControleEstoque.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(() -> {
            try {
                new ControleEstoque().setVisible(true);
            } catch (SQLException ex) {
                Logger.getLogger(ControleEstoque.class.getName()).log(Level.SEVERE, null, ex);
            }
        });
    }

    // Variables declaration - do not modify                     
    private Util.FormatarPreco formatarPreco1;
    private javax.swing.JButton jBBuscar;
    private javax.swing.JComboBox<String> jCvendedor;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTtabela;
    // End of variables declaration                   

    //carrega vendedores
    public void CarregaVendedor() throws SQLException {
        DAOvendedor dao = new DAOvendedor();
        DefaultComboBoxModel defaultComboModel = new DefaultComboBoxModel(dao.Carregar("vendedor", "empresa").toArray());
        jCvendedor.setModel(defaultComboModel);
    }
}
class Vermelho extends DefaultTableCellRenderer {

    Color defaultBackground, defaultForeground;

    public Vermelho() {

        this.defaultBackground = getBackground();
        this.defaultForeground = getForeground();
        setHorizontalAlignment(javax.swing.JLabel.RIGHT);

    }

    @Override

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

        final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        final java.awt.Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        System.out.println("QTD " +QTD);
        System.out.println("Min " + (int) value);
        System.out.println("---------------------");
        if ((int) value > QTD){
        cellComponent.setForeground(Color.white);
        cellComponent.setBackground(Color.red);
        }else{
        cellComponent.setForeground(Color.white);
        cellComponent.setBackground(Color.blue);
        }
        return c;
    }

}

A melhor forma de fazer isso, é implementando sua própria table model usando: AbstractTableModel. Com isso, vc poderá fazer todo o tratamento das cores de uma forma bem mais prática.

Boa noite, obrigado pela atenção, vc teria um exemplo de como fazer isso, eu descobri q da forma q eu fiz não esta funcionando, pois o “getTableCellRendererComponent” executa a coloração das células depois da jtable ja preenchida com os valores, por isso que eu não estava conseguindo fazer como eu gostaria, mas sabendo disso eu não tenho ideia de como fazer para ele comparar se o valor da coluna 4 é maior do q o da coluna 3 em cada linha e com isso se for maior, pintar de azul e se for menor, pintar de vermelho.

Esses atributos não devem ser estáticos.

Bom dia, obrigado, mas não deu certo ainda, pois eu não entendo como esse component funciona, pois ele é executado depois da jtable já estar completamente preenchida, preciso saber se tem como dentro dele eu conseguir mandar ele comparar o value da célula atual com o valor da célula do lado direito, isso seria o resolveria meu problema.

Montei um exemplo de uma JTable apresenta os dados de pessoas e altera a cor da coluna de acordo com a idade.

  • Menor de idade: vermelho
  • Maior de idade: verde

Usei um table model para exemplificar como fica bem mais simples de trabalhar com tabelas no swing.

Main

import java.awt.GridBagLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class MainAbstractTableModel {
	
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setLayout(new GridBagLayout());
		
		initComponents(frame);
		
		// JFrame
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
	
	private static void initComponents(JFrame frame) {
		List<Pessoa> pessoas = new ArrayList<>();
		pessoas.add(new Pessoa(1L, "Aaa", "Aaa", 15));
		pessoas.add(new Pessoa(2L, "Bbb", "Bbb", 18));
		pessoas.add(new Pessoa(3L, "Bbb", "Bbb", 30));
		
		// Table
		PessoaTableModel model = new PessoaTableModel(pessoas);
		JTable tablePessoa = new JTable(model);
		
		tablePessoa.getColumnModel()
			.getColumn(PessoaTableModel.COL_IDADE)
			.setCellRenderer(new PessoaIdadeCellRenderer());
		
		frame.getContentPane().add(new JScrollPane(tablePessoa), 0);
	}
}

PessoaTableModel

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

public class PessoaTableModel extends AbstractTableModel {
	private static final long serialVersionUID = 1L;
	
	public static final int COL_NOME = 0;
	public static final int COL_SOBRENOME = 1;
	public static final int COL_IDADE = 2;
	
	private List<Pessoa> pessoas = new ArrayList<>();
	
	public PessoaTableModel(List<Pessoa> pessoas) {
		this.pessoas = pessoas;
	}

	@Override
	public int getRowCount() {
		return pessoas.size();
	}

	@Override
	public int getColumnCount() {
		return 3;
	}
	
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		Pessoa pessoa = getRowValue(rowIndex);
		
		switch (columnIndex) {
			case COL_NOME: return pessoa.getNome();
			case COL_SOBRENOME: return pessoa.getSobrenome();
			case COL_IDADE: return pessoa.getIdade();
			default: return null;
		}
	}

	@Override
	public String getColumnName(int columnIndex) {
		switch (columnIndex) {
			case COL_NOME: return "Nome";
			case COL_SOBRENOME: return "Sobrenome";
			case COL_IDADE: return "Idade";
			default: return null;
		}
	}
	
	public Pessoa getRowValue(int rowIndex) {
		return pessoas.get(rowIndex);
	}
}

PessoaIdadeCellRenderer

import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class PessoaIdadeCellRenderer extends DefaultTableCellRenderer {
	private static final long serialVersionUID = 1L;

	@Override
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
			int row, int column) {
		Component cellRenderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
		PessoaTableModel model = (PessoaTableModel) table.getModel();
		Pessoa pessoa = model.getRowValue(row);
		
		if (pessoa.isMenorIdade()) {
			cellRenderer.setBackground(Color.RED);
		} else if (pessoa.isMaiorIdade()) {
			cellRenderer.setBackground(Color.GREEN);
		} else {
			cellRenderer.setBackground(Color.BLACK);
			cellRenderer.setForeground(Color.WHITE);
		}
		
		return cellRenderer;
	}
}

Pessoa

public class Pessoa {
	
	private final Long id;
	private final String nome;
	private final String sobrenome;
	private final int idade;
	
	public Pessoa(Long id, String nome, String sobrenome, int idade) {
		this.id = id;
		this.nome = nome;
		this.sobrenome = sobrenome;
		this.idade = idade;
	}

	public Long getId() {
		return id;
	}

	public String getNome() {
		return nome;
	}

	public String getSobrenome() {
		return sobrenome;
	}

	public int getIdade() {
		return idade;
	}
	
	public boolean isMaiorIdade() {
		return idade >= 18;
	}
	
	public boolean isMenorIdade() {
		return idade < 18;
	}
}
1 curtida

Boa tarde, obrigado pela resposta [Lucas_Camara], mas fazer o código usar uma constante da certo, o que não da certo é fazer o código usar uma variável, q é o q eu preciso, quero fazer ele comparar a coluna 3 com a coluna 4, exemplo linha 0, coluna 3, compara com coluna 4, depois linha 1, compara coluna 3, com coluna 4, e assim por diante até terminar as linhas.
Isso eu não sei fazer, nem sei se tem como fazer isso.

Da forma como exemplifiquei, acho que dá para fazer o que vc quer, pois, se entendi direito, vc precisa comparar valores de colunas diferentes, mas da mesma linha, certo?

Boa tarde Lucas, mas não deu certo, pois no seu exemplo eu estou usando uma constante, a constante é 18, só muda a comparação se é maior ou menor q 18, mas o 18 não muda, no meu caso, esse 18 seria uma variável, e ela recebe o valor de outra celular, imagina q sua tabela tenha 4 colunas, depois da idade tem uma outra coluna com outros números, dai eu quero comparar a idade da pessoa com o outro numero na mesma linha, só q da coluna idade com a outra nova coluna, é isso q eu não consigo fazer.
Mas obrigado pela sua atenção.

Esse de receber valores de outra célula, no meu exemplo, seria apenas uma outra pripriedade da classe Pessoa. A diferença para o que vc precisa é que seria uma classe Estoque:

public class Estoque {
  private int id;
  private String produto;
  private Double precoCompra;
  private int qtd;
  private int qtdMinima;

  // construtor e getters

  public boolean isQuantidadadeNecessaria() {
    return qtd >= qtdMinima;
  }
}

Assim, dá para comparar os valores das “colunas”, pq no modelo negocial (a classe Estoque), cada coluna é uma propriedade da classe Estoque.

Muito obrigado Lucas, assim realmente deu certo, consegui o resultado que eu queria