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

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!

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.

[quote=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.[/quote]

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!

Anyone?

Conseguiu resolver isso?, tbm estou no mesmo enpasse

Olá, bom dia pessoal

veja se isso ajuda vcs

[code]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) {
}

}[/code]

até…

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!!

[code]
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);
        }
    }  
}  [/code]

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é

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!

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: