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

4 respostas Resolvido
jtableprogramaçãojava
L

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.

4 Respostas

W

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:

L

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

W
Solucao aceita

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:

L

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

Criado 16 de março de 2019
Ultima resposta 17 de mar. de 2019
Respostas 4
Participantes 2