[RESOLVIDO] Como colocar um CheckBox para selecionar todas as linhas da Jtable?

Bom, eu gostaria de saber se tem como colocar um checkbox no Título de uma coluna, que quando clicado seleciona todas as linhas da tabela.

Sim, dá pra fazer.

Acredito que em programação a pergunta correta não é se dá pra fazer, mas sim como fazer.

Digamos que vc tenha uma estrutura assim:

<table>
  <tr>
    <th><input type="checkbox" id="allinputs" name="allinputs"></th>
    <th>ID</th><th>Nome</th><th>Idate</th>
  </tr>
  <tr>
    <td><input type="checkbox" id="input1" name="input1"></td>
    <td>1</td><td>João</td><td>23</td>
  </tr>
  <tr>
    <td><input type="checkbox" id="input2" name="input2"></td>
    <td>2</td><td>Maria</td><td>34</td>
  </tr>
  <tr>
    <td><input type="checkbox" id="input3" name="input3"></td>
    <td>3</td><td>José</td><td>45</td>
  </tr>
</table>

Seu JavaScript seria, basicamente, assim:

const masterCheckBox = document.querySelector('th input');
masterCheckBox.onchange = (event) =>
    checkBoxes.forEach(e =>  e.checked = event.target.checked);

Só que pode ficar um pouco mais complexo do que isso, pois temos que pensar em alguns casos. Por exemplo:

  • O que acontece se o usuário clicar na checkbox master pra selecionar todas e depois tira a seleção de uma delas?
  • O que acontece quando o usuário seleciona todas as checkboxes manualmente, sem clicar na master?

Escrevi um exemplo que lida com esses casos de uso, veja se te ajuda:

1 curtida

Então… a minha dúvida é como implementar isso em Java e não em JavaScript. Eu queria colocar um checkbox “geral” que quando eu clicasse selecionasse todos os outros checkbox’s da coluna, vou tentar deixar uma imagem pra exemplificar.

img

Nossa! Por favor, me desculpe, eu não prestei a devida atenção.

Eu fiz uns testes e cheguei a esse resultado:

import javax.swing.*;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import java.awt.*;
import java.awt.event.*;

class Main {
    private static final Object[] columns = {"", "ID", "Name", "Age"};
    private static final Object[][] data = {{false, 1, "Paulo", 23}, {false, 2, "Maria", 32}, {false, 3, "Sergio", 45}};
    private static final int checkboxColumn = 0;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(Main::buildGUI);
    }

    private static void buildGUI() {
        JTable table = new JTable(data, columns);
        JScrollPane scroll = new JScrollPane(table);

        TableColumn column = table.getColumnModel().getColumn(checkboxColumn);
        column.setCellEditor(table.getDefaultEditor(Boolean.class));
        column.setCellRenderer(table.getDefaultRenderer(Boolean.class));
        column.setHeaderRenderer(new CheckBoxHeader(table, checkboxColumn));

        JFrame frame = new JFrame();
        frame.setSize(400, 200);
        frame.getContentPane().add(scroll);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class CheckBoxHeader extends JCheckBox implements TableCellRenderer {
    CheckBoxHeader(JTable table, int checkboxColumn) {
        this.setText("Check All");

        table.getTableHeader().addMouseListener(new MyMouseListener(this, checkboxColumn));

        this.addItemListener((event) -> {
            Object source = event.getSource();
            if (!(source instanceof AbstractButton)) return;

            boolean checked = event.getStateChange() == ItemEvent.SELECTED;

            for (int x = 0, y = table.getRowCount(); x < y; x++)
                table.setValueAt(checked, x, 0);
        });
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        return this;
    }
}

class MyMouseListener extends MouseAdapter {
    private final CheckBoxHeader checkbox;
    private final int checkboxColumn;

    MyMouseListener(CheckBoxHeader checkbox, int checkboxColumn) {
        this.checkbox = checkbox;
        this.checkboxColumn = checkboxColumn;
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        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 == checkboxColumn && e.getClickCount() == 1 && column != -1)
            checkbox.doClick();
    }
}

Minha referência foi essa aqui:

https://coderanch.com/t/343795/java/Check-Box-JTable-header#1510939

É uma postagem bem velha, mas eu revi o código, fiz adaptações pra deixá-lo mais limpo. Vc vai ter que analizar pra adequar a sua necessidade. Dá pra vc ver o resultado aqui:

2 curtidas

Muito obrigada, consegui adaptar pro meu modelo tranquilamente :+1::smiley:

2 curtidas