JCheckBox no Cabeçalho de uma JTable

Postado por ugleiton dia 17 de setembro de 2010 as 13:23


Procedimento em java:


  1. Criar uma classe para o método setHeaderRenderer do TableColumn
  2. /*
     * PhDCheckHeader.java
     *
     * Created on 17/09/2010, 15:32:51
     */
    package componente;
    
    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.table.JTableHeader;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.table.TableColumnModel;
    
    /**
     *
     * @author Ugleiton
     */
    public class PhDCheckHeader extends JCheckBox implements TableCellRenderer, MouseListener {
    
        protected PhDCheckHeader rendererComponent;
        protected int column;
        protected boolean mousePressed;
    
        public PhDCheckHeader(ItemListener itemListener) {
            setText("");
            setOpaque(true);
    
            rendererComponent = this;
            rendererComponent.addItemListener(itemListener);
            this.setSelected(true);
        }
    
        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) {
                    header.addMouseListener(rendererComponent);
                }
            }
            setColumn(column);
            return rendererComponent;
        }
    
        protected void setColumn(int column) {
            this.column = column;
        }
    
        public int getColumn() {
            return column;
        }
    
        protected void handleClickEvent(MouseEvent e) {
            
        }
    
        public void mouseClicked(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 coluna = tableView.convertColumnIndexToModel(viewColumn);
    
                if (viewColumn == getColumn() && e.getClickCount() == 1 && coluna != -1) {
                    doClick();
                }
            }
            ((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) {
        }
    }
    
  3. Criar um Método para setar o HeaderRenderer
  4. public void colunaCheck(){
    
            TableColumn tc = table.getColumnModel().getColumn(COL_CHECK);
            tc.setCellEditor(table.getDefaultEditor(Boolean.class));
            tc.setCellRenderer(table.getDefaultRenderer(Boolean.class));
    
            tc.setHeaderRenderer(new PhDCheckHeader(new ItemListener() {
    
                public void itemStateChanged(ItemEvent e) {
                    //ações quando clicar no check
                    Object source = e.getSource();
                    if (source instanceof AbstractButton == false) {
                        return;
                    }
                    boolean check = e.getStateChange() == ItemEvent.SELECTED;
                    int coluna = 0;
                    for (int i = 0; i < table.getRowCount(); i++) {
                        table.setValueAt(new Boolean(check), i, coluna);
                    }
                }
            }));
        }
    
    
Fonte

4 comentários:

sout jr disse...

Parabéns pela gambiarra!

ugleiton disse...

quando aprendemos a utilizar orientação a objetos e a combinar elementos do Java, não se trata de gambiarra, e sim de conhecimento.
se fosse assim, uma boa gambiarra seria a criação do JCombobox, que na verdade é a combinação de um JListBox e um JTextField.

Anônimo disse...

Parabéns, pelo código, muito bem implementado, não de bola para criticas.

Postar um comentário

Marcadores

Computação (8) Java (7) Excel (2) Humor (2) NetBeans (2) Textos (2) Curiosidades (1) IRPF (1) Musicas (1)