ago

27

Mudando a cor, fonte, alinhamento, etc… de células de JTable

By Felipe Saab

Ae galera,
Hoje vou dar uma dica bem interessante pra manipular as células de uma JTable.

Vamos imaginar que devemos representar uma matriz dentro de uma JTable, ou seja, devemos ter um cabeçalho para as linhas e outro para as colunas.
Nosso objetivo vai ser construir a seguinte matriz:

Vamos começar definindo as colunas dessa tabela:

String colunas[] = {“”,”A”,”B”,”C”};

Como a primeira coluna da tabela vai servir para representar o cabeçalho das linhas, então a primeira coluna fica sem nome.

Agora vamos definir a matriz de dados, lembrando que a primeira coluna será o cabeçalho ainda:

String dados[][] = {{"A","0","1","0"},{"B","1","0","1"},{"C","0","1","0"}};

Agora que temos todos os dados necessários, vamos completar a tabela:

jTable.setModel(new DefaultTableModel(dados,colunas));

Obs: estou supondo que a tabela já foi instanciada e que seu nome seja “jTable”.
Pronto, agora a tabela está criada, porém ela não parece uma matriz ainda:


Um pouco de teoria: o Java utiliza uma classe chamada TableCellRenderer para definir as propriedades de cada célula (cor de fundo, fonte, alinhamento, entre outras). Essa classe mostra a tabela como nós estamos acostumados a ver, porém se nós quisermos personalizar as células, nós devemos criar a nossa própria classe TableCellRenderer, para tal, devemos criar uma classe que herda de DefaultTableCellRenderer.

Como nossa finalidade é muito simples (apenas mudar a cor e o alinhamento), vamos criar o nosso objeto em tempo de execução mesmo:

DefaultTableCellRenderer letras = new DefaultTableCellRenderer() {
 
    public void setValue(Object value) {
        setBackground(new Color(238, 238, 238));
        setForeground(Color.BLACK);
        setHorizontalAlignment(JLabel.CENTER);
 
        //outras alterações entram aqui...
        super.setValue(value);
    }
};

Acabamos de criar o objeto letras, que é do tipo DefaultTableCellRender e reescrevemos o método setValue(Object value).

É dentro desse método que a mágica acontece: como estamos criando um objeto que define as propriedades de uma célula, basta alterá-las e consequentemente alterar a(s) célula(s).

Já com o nosso próprio objeto DefaultTableCellRender criado, basta atribuí-lo à célula desejada. No nosso caso, como queremos modificar todas as células de uma mesma coluna, vamos setar o nosso DefaultTableCellRender para todas as células de uma coluna:

TableColumn tc = jTable.getColumn("");
tc.setCellRenderer(letras);

TableColumn é a classe que controla todas as células da coluna, portanto se setarmos o nosso próprio DefaultTableCellRender como CellRenderer dela, todas as células daquela coluna vão ser personalizadas.
Para recuperar uma TableColumn usa-se o método getColumn(Object id) da JTable, onde id é o que está escrito no cabeçalho da coluna. Como definimos anteriormente que a primeira coluna seria “” , recuperamos ela do mesmo jeito.

Até aqui agente tem a seguinte tabela:

Já está bem mais parecida com uma matriz, mas só para dar uma melhorada no visual, vamos centralizar as colunas dos dados também. Para isso precisamos definir um outro DefaultTableCellRender que só centralize o texto nas células:

DefaultTableCellRenderer numeros = new DefaultTableCellRenderer() {
 
    public void setValue(Object value) {
        setHorizontalAlignment(JLabel.CENTER);
        super.setValue(value);
    }
};
 
jTable.getColumn("A").setCellRenderer(numeros);
jTable.getColumn("B").setCellRenderer(numeros);
jTable.getColumn("C").setCellRenderer(numeros);

Pronto! Agora ficou igual uma matriz mesmo:

Obs: aqui eu fiz a tabela inteira estática só para facilitar o exemplo, mas nada impede que você personalize uma tabela com dados vindos de outra fonte (entrada, banco de dados…), a idéia é sempre a mesma.

É isso ai pessoal…
Qualquer duvida, dica ou seja lá o que for, posta um comentário ae… ^^

Até a próxima…

10 Responses so far

Boa noite!

Eu criei uma jTable para inserir dados em uma tabela do Access, porém o que me incomoda um pouco é que quando eu clico na célula ela fica azul… Eu preciso dar dois cliques na célula para inserir dados e gostaria de saber se é possível configurar a jTable para inserir dados só posicionando o ponteiro do mouse ou usando as setas do teclado para me movimentar pelas células sem ter que ficar dando dois cliques para conseguir inserir os dados.

Obrigado.

Então André,

A própria JTable já deixa você navegar pelos registros com as setas, para alterar o registro selecionado basta apertar o F2. Para salvar as alterações é só apertar o Enter, para cancelar é o Esc.

Só um detalhe: para conseguir navegar nos registros com as setas o foco deve estar na JTable, ou seja, você precisa clicar nela pelo menos uma vez (ou chegar nela com o Tab).

Sobre a cor da linha selecionada… você me pegou em… Dei uma pesquisada meio rápida e não consegui achar nada… ”/
Quando eu tiver mais um tempo eu dou uma procurada melhor e crio um post sobre esse assunto.

[]s,
Saab.

boa tarde!! sou novato com java!! testei o seu cogido mas me da um erro escrevi ele assim
public text_tabela() {
initComponents();

final DefaultTableCellRenderer letras = new DefaultTableCellRenderer() {

public void setValue(Object value) {
setBackground(new Color(238, 238, 238));
setForeground(Color.BLACK);
setHorizontalAlignment(JLabel.CENTER);

obrigado

//outras alterações entram aqui…
super.setValue(value);
}
};
TableColumn tc = jTable1.getColumn(“”);
tc.setCellRenderer(letras);}

Cara, se você falasse o erro ia ser muito mais fácil da gente ver o que está acontecendo…

obrigado mas ja descobrir qual era o problema…
teria uma pergunta

esse código ele pinta todas as linhas de uma coluna?
eu precisava de um código q pintava todas as colunas de uma linha
o objetivo é .: quando clicar 2 vezes na linha ele pinta ela
depois clicar 2 vezes em outra e pintar deixando tipo selecionada aquela linha
e ad demais já selecionada
obrigado pela aguda!!!!!

Pergunta boa viu… dei uma procurada na internet e nao achei nada…
+ a própria JTable já faz isso pra vc… se vc clicar em qualquer celula ela já seleciona a linha, e se vc segurar o Ctrl e clicar em outra linha ela já marca todas as clicadas.

Quanto a fazer seu próprio estilo de marcação das linhas… ai eu vou ficar te devendo mesmo viu…

Olá,
esse “tuto ” me ajudou muito,foi o melhor e mais simples que encontrei de JTable;
Mas ainda tenho uma duvida:Como faço pra aplicar uma cor em uma determinada linha ou coluna
? me ajudem aew.
Valews

Então Karine,
Como dito ali em cima, uma vez que você define o seu DefaultTableCellRenderer (objeto que será responsável por estilizar as células) você o aplica a uma determinada coluna da seguinte maneira:
———————-
TableColumn tc = jTable.getColumn(“Nome”); //recupera a coluna cujo o título é “Nome”
tc.setCellRenderer(objeto_estilizador); //aplica somente nesta coluna os estilos definidos pelo DefaultTableCellRenderer “objeto_estilizador”
———————-
Agora como aplicar os estilos a uma determinada linha eu ainda não cheguei a pesquisar, vou ficar te devendo a resposta.
Boa sorte com a tua pesquisa e teu projeto.
[].

Boa noite,

Diante deste código, como faço para colorir células de forma individual?

Cara, muito bom!!! Extremamente simples. Com seus exemplos, criei métodos estáticos no meu utils que resolveram meus problemas de alinhamento e demais… Valeu mesmo… abraços…

Leave a comment