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

12 respostas
G

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;
   }

}
G

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);
G

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.

A

Bom dia a todos!

Geidivan, tente isso aqui:

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

Abraços@!!

G

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

A

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!

G

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

A

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!

G

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í.

A

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!

G

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