JTable + AbstractTableModel + coluna de CheckBoxes com Header "Selecionar todos"

8 respostas
N

Bom dia, galera do GUJ!
Tudo bem??

Bom, eu tenho uma JTable bonitinha aqui. Eu quero adicionar nela um CheckBox no título da coluna, para dar aquele efeito de “Selecionar/Deselecionar todos” na JTable.
Ao clicar nessa CheckBox geral, selecionar todos os registros da tabela e, ao deselecionar, apagar a seleção dos registros.

Anexo ao tópico tem um exemplo de onde quero colocar.
Alguma ideia, pessoal?

Valeu, fiquem com Deus, abraço!

8 Respostas

V

Modificar o cabeçalho da tabela não é uma tarefa das mais fáceis.

Veja um exemplo:
http://www.exampledepot.com/egs/javax.swing.table/CustHeadRend.html

Pouco importa se você usou ou não AbstractTableModel. Esse é um aspecto da view.

N

ViniGodoy:
Modificar o cabeçalho da tabela não é uma tarefa das mais fáceis.

Veja um exemplo:
http://www.exampledepot.com/egs/javax.swing.table/CustHeadRend.html

Pouco importa se você usou ou não AbstractTableModel. Esse é um aspecto da view.

Perfeito, Vini. Alterei o Header da coluna que eu queria. Porém, ela perde o LaF de um cabeçalho [vide anexo ao tópico].
Outra coisa: como faço para implementar um mouseListener para esse meu header?
Quero fazer a implementação do “Marcar/desmarcar todos”, mas não tô conseguindo saber ao certo onde devo implementar/adicionar esse evento que criei.

Valeu, abraço!

N

Anyone?

F

Conseguiu resolver isso?, tbm estou no mesmo enpasse

A

Olá, bom dia pessoal

veja se isso ajuda vcs

import java.awt.Component;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JCheckBox;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;

public class CabecalhoJTableCheckBox extends JCheckBox implements TableCellRenderer, MouseListener{
    
  protected CabecalhoJTableCheckBox rendererComponent;  
  protected int column;  
  protected boolean mousePressed = false;  
  public CabecalhoJTableCheckBox(ItemListener itemListener) {  
    rendererComponent = this;  
    rendererComponent.addItemListener(itemListener);  
  }  
  public Component getTableCellRendererComponent(  
      JTable table, Object value,  
      boolean isSelected, boolean hasFocus, int row, int column) {  
    if (table != null) {  
      JTableHeader header = table.getTableHeader();  
      
      if (header != null) {  
        rendererComponent.setForeground(header.getForeground());  
        rendererComponent.setBackground(header.getBackground());  
        rendererComponent.setFont(header.getFont());  
        
        header.addMouseListener(rendererComponent);  
      }  
    }  
    setColumn(column);  
    
    
    rendererComponent.setText("Todos");  
    setBorder(UIManager.getBorder("TableHeader.cellBorder"));  
    return rendererComponent;  
  }  
  protected void setColumn(int column) {  
    this.column = column;  
  }  
  public int getColumn() {  
    return column;  
  }  
  protected void handleClickEvent(MouseEvent e) {  
    if (mousePressed) {  
      mousePressed=false;  
      JTableHeader header = (JTableHeader)(e.getSource());  
      JTable tableView = header.getTable();  
      TableColumnModel columnModel = tableView.getColumnModel();  
      int viewColumn = columnModel.getColumnIndexAtX(e.getX());  
      int column = tableView.convertColumnIndexToModel(viewColumn);  
   
      if (viewColumn == this.column && e.getClickCount() == 1 && column != -1) {  
        doClick();  
      }  
    }  
  }  
  public void mouseClicked(MouseEvent e) {  
    handleClickEvent(e);  
    ((JTableHeader)e.getSource()).repaint();  
  }  
  public void mousePressed(MouseEvent e) {  
    mousePressed = true;  
  }  
  public void mouseReleased(MouseEvent e) {  
  }  
  public void mouseEntered(MouseEvent e) {  
  }  
  public void mouseExited(MouseEvent e) {  
  }  
    
}

até...

A

Opá .. somente para completar a resposta ...
no construtor da classe pede como parametro um ItenListner ...
segue uma implementação modelo ... claro que pode ser melhorada!!

class MyItemListener implements ItemListener {  
        
        public void itemStateChanged(ItemEvent e) {  
            
            Object source = e.getSource();  
            
            if (source instanceof AbstractButton == false) return;  
            
            boolean checked = e.getStateChange() == ItemEvent.SELECTED;  
            
            for (int i = 0; i < modelo.getRowCount(); i++) {
                modelo.setValueAt(checked, i, 0);
            }
        }  
    }
e para usar as classes basta fazer da seguinte maneira:
TableColumnModel modeloColuna = suaTabela.getColumnModel();
modeloColuna.getColumn(indiceDaColuna).setHeaderRenderer(new CabecalhoJTableCheckBox(new MyItemListener()));

Espero ter ajudado
Até

L

Boa tarde a todos.

Sei que já faz tempo desde a última postagem neste tópico mais tenho uma dúvida…

Na Classe MyItemListener, de qual tipo seria o objeto modelo? Vi que não tem uma declaração do mesmo e não consegui aplicar no meu ambiente o “Selecionar Todos” pelo header!

Seria a minha tabela ou o model dela?

Se sim, então euteria que passar como parâmetro minha tabela para esta classe executar ou alterando os parâmetros do método itemStateChanged() eu perco a referência @Override?

Fico no aguardo e agradeço a atenção!

L

Bom só pra deixar registrado, já consegui resolver!

Criei dois objetos públicos: um para receber minha tabela e outro para receber o scroll da tabela.

Quando clico no evento para selecionar tudo, ele estava selecionando porém não me mostrava até que eu me toquei e dei um repaint no scroll.

Show de bola! :slight_smile:

Criado 26 de setembro de 2011
Ultima resposta 20 de ago. de 2014
Respostas 8
Participantes 5