Como usar TableCellRederer para centralizar texto em uma célula? [RESOLVIDO]

12 respostas
geidivan

Pessoal, estou tentando criar uma classe para definir um formato para as células de uma tabela, mas não consigo.

Primeiro testei o seguinte:

DefaultTableCellRenderer renderer =  new DefaultTableCellRenderer();
renderer.setToolTipText("Click for combo box");
jTabela.getColumnModel().getColumn(0).setCellRenderer(renderer);

Nada aconteceu. Depois tentei criar uma classe específica:

public class formatoCelula extends JLabel implements TableCellRenderer{            

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

   public TableCellRenderer get () {
      this.setHorizontalAlignment(JLabel.CENTER);      
      this.setToolTipText("Teste");  
      return this;
   }
   
}

Depois chamo o método:

formatoCelula f = new formatoCelula();   
jTPesUsu.getColumnModel().getColumn(0).setCellRenderer(f);

Mas nada aconteceu também. O que está errado? Alguém pode me ajudar?

12 Respostas

V

Utilizo desta forma:

public class MyCellRenderer extends DefaultTableCellRenderer {

   private int align;

   public MyCellRender(int align) {
      this.align = align;
   }
 
   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        JLabel label = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        label.setHorizontalAlignment(align);
        return label;
   }

}
geidivan

Não tem uma maneira de fazer isso sem ter que passar todos esses parametros? Quero centralizar a coluna inteira, sem distinguir uma celula exatamente.

V

Mas é so manter da mesma forma

MyCellRenderer renderer =  new MyCellRenderer(JLabel.CENTER);   
jTabela.getColumnModel().getColumn(0).setCellRenderer(renderer);
geidivan

Deu erro de conversão de tipo.

symbol  : method getTableCellRendererComponent(javax.swing.JTable,java.lang.Object,boolean,boolean,int,int)
location: class javax.swing.JLabel  JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

Não é possível converter para JLabel.

ajfilho

Bom dia a todos!

Geidivan, tente isso aqui:

DefaultTableCellRenderer centro = new DefaultTableCellRenderer(); centro.setHorizontalAlignment(SwingConstants.CENTER); tabela.getColumnModel().getColumn(0).setCellRenderer(centro);

Abraços@!!

geidivan

Já tentei também. Não acontece nada.

ajfilho

Eu vi que você na primeira tentativa, fez um código parecido com o meu

Você fez assim:

DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); renderer.setToolTipText("Click for combo box"); jTabela.getColumnModel().getColumn(0).setCellRenderer(renderer);

Eu fiz assim:

DefaultTableCellRenderer centro = new DefaultTableCellRenderer(); centro.setHorizontalAlignment(SwingConstants.CENTER); tabela.getColumnModel().getColumn(0).setCellRenderer(centro);

Aqui funciona corretamente!

Abraços!

geidivan

Já testei deste jeito também. Não aconteceu nada.

ajfilho

Nas minhas tabelas eu uso essa classe para renderizar as células:

import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

/**
 *
 * @author AJFILHO
 */
public class CellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {

    public CellRenderer() {
        super();
    }

    @Override
    public void setHorizontalAlignment(int alignment) {
        super.setHorizontalAlignment(alignment);
    }
    
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        Component renderer = super.getTableCellRendererComponent(
                table, value, isSelected, hasFocus, row, column);
        ((JLabel) renderer).setOpaque(true);
        Color foreground, background;
        if (isSelected) {
            foreground = Color.white;
            background = Color.blue;
        } else {
            if (row % 2 == 0) {
                foreground = Color.black;
                background = Color.white;
            } else {
                foreground = Color.white;
                background = Color.darkGray;
                
            }
        }
        renderer.setForeground(foreground);
        renderer.setBackground(background);
        return renderer;
    }

    @Override
    public void validate() {
    }

    @Override
    public void revalidate() {
    }

    @Override
    protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
    }

    @Override
    public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {
    }

Aí depois eu só faço chamar assim:

CellRenderer c = new CellRenderer();
c.setHorizontalAlignment(SwingConstants.RIGHT);
t.getColumnModel().getColumn(0).setCellRenderer(cc);

Espero ter ajudado um pouco mais!

Abraços!

geidivan

Copiei e colei seu código. Não sei o que está acontecendo.

Eu já tenho a tabela com modelo criada através da paleta de componentes do Netbeans.

Parece que não consigo alterar as propriedades desta tabela. Nada acontece.

Cara, me ajuda aí.

ajfilho

Pq você não cria uma classe que extenda algum tipo de TableColumnModel (DefaultTableColumnModel)?

Dessa forma, você mesmo pode manipular informações da tabela.

Particularmente eu prefiro assim.

Exemplo:

Eu cria uma tabela no meu Form e chamo de tableCarro, somente isso, não defino o modelo dela ainda

Aí crio minha classe para manipular as colunas.

import java.awt.FontMetrics;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;

/**
 *
 * @author AJFILHO
 */
public class ColumnModelDeclaracao extends DefaultTableColumnModel{

    public ColumnModelDeclaracao(){
        
    }
    
    public ColumnModelDeclaracao(FontMetrics fm, String texto){
        if(texto.equalsIgnoreCase("carro")){
            int letra = fm.stringWidth("M");
            addColumn(criaColuna(0, 80 * letra, fm, true, "Placa"));
            addColumn(criaColuna(1, 150 * letra, fm, true, "Modelo"));          
            addColumn(criaColuna(2, 90 * letra, fm, true, "Fabricante"));          
            addColumn(criaColuna(3, 200 * letra, fm, true, "Ano")); 
        }
    }
    
    private TableColumn criaColuna(int columnIndex, int largura, FontMetrics fm, boolean resizable, String titulo){
        int larguraTitulo = fm.stringWidth(titulo + "  ");
        if (largura < larguraTitulo){
            largura = larguraTitulo;            
        }
        CellRenderer c = new CellRenderer();
        TableColumn col = new TableColumn(columnIndex);
        col.setCellRenderer(c);
        col.setHeaderRenderer(null);
        col.setHeaderValue(titulo);
        col.setPreferredWidth(largura);
        if(!resizable){
            col.setMaxWidth(largura);
            col.setMinWidth(largura);
        }
        col.setResizable(resizable);
        return col;        
    } 
}

Depois cria minha classe para renderizar a célula:

import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

/**
 *
 * @author AJFILHO
 */
public class CellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {

    public CellRenderer() {
        super();
    }

    @Override
    public void setHorizontalAlignment(int alignment) {
        super.setHorizontalAlignment(alignment);
    }
    
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        Component renderer = super.getTableCellRendererComponent(
                table, value, isSelected, hasFocus, row, column);
        ((JLabel) renderer).setOpaque(true);
        Color foreground, background;
        if (isSelected) {
            foreground = Color.white;
            background = Color.blue;
        } else {
            if (row % 2 == 0) {
                foreground = Color.black;
                background = Color.white;
            } else {
                foreground = Color.white;
                background = Color.darkGray;
                
            }
        }
        renderer.setForeground(foreground);
        renderer.setBackground(background);
        return renderer;
    }

    @Override
    public void validate() {
    }

    @Override
    public void revalidate() {
    }

    @Override
    protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
    }

    @Override
    public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {
    }

Depois disso feito, volto para o meu form e crio o método para montar a tabela

public void montarTabela(JTable t) {
        DefaultTableModelImpl modelo = new DefaultTableModelImpl();
        t.setModel(modelo);
        t.setAutoCreateColumnsFromModel(false);
        t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        fm = t.getFontMetrics(t.getFont());
        ColumnModelDeclaracao columnModel = new ColumnModelDeclaracao(fm, "carro");
        t.setColumnModel(columnModel);
        CellRenderer cc = new CellRenderer();
        cc.setHorizontalAlignment(SwingConstants.RIGHT);
        t.getColumnModel().getColumn(0).setCellRenderer(cc);
        t.getColumnModel().getColumn(3).setCellRenderer(cc);
    }

Essa classe DefaultTableModelImpl é interna e a uso dentro do form mesmo

private static class DefaultTableModelImpl extends DefaultTableModel {
        public DefaultTableModelImpl(Object[][] data, Object[] columnNames) {
            super(data, columnNames);
        }

        public DefaultTableModelImpl() {
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            return false;
        }
    }

Depois de ter criado o método para montar a tabela, chamo ele dentro do meu construtor

public ConsultarCarro() {
    initComponents();  //Aquele Método que o Netbeans é responsável para agrupar botões, panels, entre outros  
    montarTabela
}

Isso é somente para criar a tabela, porém os valores das células das colunas 0 e 3 virão centralizados, quando ocorrer uma busca e essa busca for atribuida a uma jTable.

Tomara que ajude agora! :lol:

Abraços!

geidivan

Consegui. O código estava sendo chamado no ComponentShow e não funcionava.

Coloquei o código no pós-inicialização do JTable e funcionou.

Obrigado cara.

Criado 4 de dezembro de 2008
Ultima resposta 5 de dez. de 2008
Respostas 12
Participantes 3