Colorir somente células de linha selecionada

5 respostas
P

Quero comparar duas células de uma jTable e pintá-las conforme uma ser maior/menor do que um dado valor digitado pelo usuário.Tá funcionando parcialmente, mas porque está pintando TODA a coluna não apenas as células que foram editadas!Peguei um código daqui mesmo e modifiquei para comparação:

int selecionado=table.getSelectedRow();//pega a linha slecionada
if(n.getLimite().equals("MÍN.")){ //if que compara o limite mínimo de um valor ÚNICO
                  media=n.getValor_normalizado();
              for(int i =0;i<table.getRowCount();i++){
               if(selecionado==i){   	
                 BigDecimal minimo= new BigDecimal(model.getValueAt(i,6).toString());
                 BigDecimal maximo= new BigDecimal(model.getValueAt(i,7).toString());                 
                if(minimo.compareTo(media)<0){
                 TableCellRenderer tcr = new ColorirVermelho();
                 TableColumn column = table.getColumnModel().getColumn(6);
                 column.setCellRenderer(tcr);
                }else if(minimo.compareTo(media)>0){
                 TableCellRenderer tcr = new ColorirAzul();
                 TableColumn column = table.getColumnModel().getColumn(6);
                 column.setCellRenderer(tcr);
                }
                if(maximo.compareTo(media)>0){
               	  TableCellRenderer tcr = new ColorirAzul();
                   TableColumn column = table.getColumnModel().getColumn(7);
                               column.setCellRenderer(tcr);
                 }else if(maximo.compareTo(media)<0){
                  TableCellRenderer tcr = new ColorirVermelho();
                   TableColumn column = table.getColumnModel().getColumn(7);
                               column.setCellRenderer(tcr);
                 }
               }//fim do if de selecionado   
              }//fim do for
                
        	   }//fim do if de limite mín

E para pintar uso:

class ColorirAzul extends JLabel implements TableCellRenderer{
	private static final long serialVersionUID = -4187163147076513197L;
  public Component getTableCellRendererComponent(
     JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int column){
	  setHorizontalAlignment(SwingConstants.CENTER);
	  setFont(new Font("Serif", Font.BOLD, 12));
        setForeground(Color.BLUE);
     setText(value.toString());
     return this;
  }

    public void validate() {}
   public void revalidate() {}
  protected void firePropertyChange(String propertyName,
      Object oldValue, Object newValue) {}
   public void firePropertyChange(String propertyName,
        boolean oldValue, boolean newValue) {}
   }

Será que isso ocorre por que eu uso isso para centralizar as células como renderer:

Como eu resolvo isso(sem eliminar esse renderer pois preciso do texto centralizado)?

5 Respostas

rafaelgimenes
eu uso essa classe
public class StatusColumnCellRenderer extends DefaultTableCellRenderer {
  @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {

    //Cells are by default rendered as a JLabel.
    JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);

    //Get the status for the current row.
    CustomTableModel tableModel = (CustomTableModel) table.getModel();
    if (tableModel.getStatus(row) == CustomTableModel.APPROVED) {
      l.setBackground(Color.GREEN);
    } else {
      l.setBackground(Color.RED);
    }

  //Return the JLabel which renders the cell.
  return l;

}

depois Table.getColumnModel().getColumn(columnIndex).setCellRenderer(new StatusColumnCellRenderer());

Ironlynx

Essa solução do rafaelgimenes exige cuidado.
PaulH, pelo que li no seu post anterior, vc também formata a célula para decimais(além de centralizar e colorir), certo?
veja esse post que também lhe ajudará: http://www.guj.com.br/java/63893-colorir-linha-especifica-em-jtable

Tenho calafrios quando junta editar+formatar+executar uma operação+formatar+pintar numa única JTable.Por mais experiência que se tenha, sempre surge um probleminha novo… :roll:

P

Ironlynx,
tentei a solução do rafael e a sua.Ainda continua pintando a coluna toda de opções, e não a célula.

Ironlynx

PaulH,
lamentavelmente, o Java não lhe fornece um controle óbvio para cada célula da JTable(seria ótimo poder fazer jogo de tabuleiros e planilhas tipo excel com facilidade).

Você terá que FORÇAR o render das células na jtable.Modificando o seu post, tem algo + ou - assim:

public class ColorirAzul extends DefaultTableCellRenderer{ int selectedRow=-1; public ColorirAzul(int row){ super(); this.selectedRow=row; } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column){ Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if(selectedRow!=-1){ if(selectedRow==row){ ((JLabel) cell).setHorizontalAlignment(SwingConstants.CENTER); cell.setFont(new Font(&quot;Serif&quot;, Font.BOLD, 12)); cell.setForeground(Color.BLUE); ((JLabel) cell).setText(value.toString()); }else{ cell.setForeground(Color.BLACK);//deixará as demais céluas em preto } } return this; }
E na hora de usar:

if(maximo.compareTo(media)&gt;0){ TableCellRenderer tcr = new ColorirAzul(selecionado); TableColumn column = table.getColumnModel().getColumn(7); column.setCellRenderer(tcr);
Onde selecionado corresponde a linha selecionada pela sua jTable. :wink:

P

Ironlynx,
muito obrigado!Funcionou perfeitamente! :thumbup:

Criado 8 de agosto de 2012
Ultima resposta 10 de ago. de 2012
Respostas 5
Participantes 3