Desenvolvedor e Analista de Sistemas | IFPA

domingo, 3 de março de 2013

Java - Exemplo de Matriz: mudando a cor, fonte, alinhamento, etc… de células de JTable

com 0 Comentário

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…

+1

0 comentários :

Postar um comentário

Total de visualizações